Pandas数据类型转换

Pandas数据类型转换

一、Pandas中的数据类型:

不管是 Series还是 DataFrame的每一列,都有对应的数据类型。在 Pandas中存在以下数据类型。

Pandas dtypePython 类型Numpy类型描述objectstr或者mixed(混合类型)string_, unicode_, mixed类型文本或者是混合的数值或非数值类型int64intint_, int8, int16, int32, int64, uint8, uint16, uint32, uint64整数类型float64floatfloat_, float16, float32, float64浮点类型boolboolbool_布尔类型datetime64NAdatetime日期和时间类型timedeltaNANA时间差categoryNANA有限的列表文本值(分类)

案例数据文件:

这里我们以一个 sales_data_types.csv文件为例。来讲解后面的知识点。读取代码如下:

import pandas as pd
import numpy as np

df = pd.read_csv("data/sales_data_types.csv")
df.head()

输出结果为:

Pandas数据类型转换

数据类型相关操作:

1. 查看DataFrame所有列的类型:

通过 df.dtypes或者是 df.info,即可查看 df对象的类型。输入 df.dtypes输出结果如下:

Customer Number    float64
Customer Name       object
2016                object
2017                object
Percent Growth      object
Jan Units           object
Month                int64
Day                  int64
Year                 int64
Active              object
dtype: object

输入 df.info()输出结果如下:

<class 'pandas.core.frame.dataframe'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 10 columns):
 #   Column           Non-Null Count  Dtype

[lots more code here]

ValueError: could not convert string to float: '$15,000.00'
</module></ipython-input-45-999869d577b0>

这是因为在 2016这一列中,有 $和逗号,直接强制转换会抛出异常。这时候就需要使用自定义转换函数,把 $去掉,然后再转换。代码如下:

def convert_currency(val):
"""
    &#x8F6C;&#x6362;&#x5B57;&#x7B26;&#x4E32;&#x7C7B;&#x578B;&#x4E3A;&#x6D6E;&#x70B9;&#x7C7B;&#x578B;
     - &#x79FB;&#x9664; $&#x7B26;&#x53F7;
     - &#x79FB;&#x9664;&#x9017;&#x53F7;
     - &#x8F6C;&#x6362;&#x4E3A;&#x6D6E;&#x70B9;&#x7C7B;&#x578B;
"""
    new_val = val.replace(',','').replace('$', '')
    return float(new_val)

df['2016'].apply(convert_currency)

以上代码,也可以将 convert_currency函数使用 lambda表达式来替换。示例代码如下:

df['2016'].apply(lambda x: x.replace('$', '').replace(',', '')).astype('float')

4. 使用 np.where 更换数据类型:

比如 df['Active']这列,我们可以认为只要值是 Y,那么就设置为 True,否则就设置为 False。代码如下:

np.where(df['Active']=='Y', True, False)

5. pandas工具类函数:

pd.to_numeric函数:

pd.to_numeric函数是用于将数据转换为数值类型,他的功能更加丰富一些,我们先来看下这个函数定义的参数:

pd.to_numeric(data, errors, downcast)
  1. data:需要进行类型转换的数据。
  2. errors:在发生转换错误时的处理方式。有 ignoreraisecoerce可选,默认类型为 raise,其中 coerce代表在发生转换异常的时候,会使用 NAN来代替。
  3. downcast:期望转换的类型。有 integersignedunsignedfloat可选,默认值为None。如果为None,函数会自动判断需要转换的类型。这个参数设置后,不一定会按照设置的类型来转换,比如在转换的时候出现了NAN值,我们都知道NAN值是float类型,这时候如果你指定为 integer也没有任何效果。

示例代码如下:

pd.to_numeric(df['Jan Units'], errors='coerce', downcast="integer")

输出结果如下:

0    500.0
1    700.0
2    125.0
3     75.0
4      NaN
Name: Jan Units, dtype: float64

可以看到虽然我们设置了类型为 integer,但最终还是 float64,原因是在转换 Jan Units字段的时候,最后一个数据出现了 NAN

如果不想让转换失败的值为 NAN,比如想用 0来填充。那么可以使用 fillna来实现。示例代码如下:

pd.to_numeric(df['Jan Units'], errors='coerce').fillna(0)

pd.to_datetime函数:

这个函数功能非常强大,可以将以下类型转换为 datetime类型:

  1. int、floats时间戳类型。
  2. 时间格式的字符串类型。
  3. np.array一维数组、列表或者元组。
  4. Series、DataFrame或者字典类型。

下面分别来进行讲解。

  1. int、floats时间戳类型。
    必须指定 unit参数为 s,也就是秒。也可以指定为 ms,代表毫秒, ns为纳秒(1毫秒=10^6纳秒)。
&#x6574;&#x5F62;
pd.to_datetime(1642400714, unit="s")
&#x6D6E;&#x70B9;&#x7C7B;&#x578B;
pd.to_datetime(1642400714.3847, unit="s")
&#x6BEB;&#x79D2;
pd.to_datetime(1642400714111, unit="s")
  1. 时间格式的字符串类型。时间格式可以参考:https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior
&#x5C06;&#x5B57;&#x7B26;&#x4E32;&#x6309;&#x7167;&#x6307;&#x5B9A;&#x683C;&#x5F0F;&#x8F6C;&#x6362;&#x4E3A;datetime&#x7C7B;&#x578B;
pd.to_datetime('20220101', format='%Y%m%d')
  1. np.array一维数组、列表或者元组。
&#x6839;&#x636E;&#x539F;&#x59CB;&#x65F6;&#x95F4;&#x8F6C;&#x6362;
pd.to_datetime([1, 2, 3], unit='D',
              origin=pd.Timestamp('2022-01-01'))

输出结果为:

DatetimeIndex(['2022-01-02', '2022-01-03', '2022-01-04'], dtype='datetime64[ns]', freq=None)

或者直接将列表中的字符串转换为时间类型:

pd.to_datetime(['2018-10-26 12:00 -0530', '2018-10-26 12:00 -0500'])

输出结果为:

Index([2018-10-26 12:00:00-05:30, 2018-10-26 12:00:00-05:00], dtype='object')
  1. Series或者DataFrame类型。
s = pd.Series(['3/11/2000', '3/12/2000', '3/13/2000'])
pd.to_datetime(s, infer_datetime_format=True)

其中 infer_datetime_format代表自动推测时间格式。
输出结果为:

0   2000-03-11
1   2000-03-12
2   2000-03-13
dtype: datetime64[ns]

综合在一起:

我们可以把转换数据类型的工作,在一开始读取文件的时候就指定好。示例代码如下:

def convert_percent(val):
"""
    &#x8F6C;&#x5316;%&#x7684;&#x5B57;&#x7B26;&#x4E32;&#x4E3A;&#x6D6E;&#x70B9;&#x7C7B;&#x578B;
    - &#x79FB;&#x9664; %
    - &#x9664;&#x4EE5;100
"""
    new_val = val.replace('%', '')
    return float(new_val) / 100

df_2 = pd.read_csv("data/sales_data_types.csv",
                   dtype={'Customer Number': 'int'},
                   converters={'2016': convert_currency,
                               '2017': convert_currency,
                               'Percent Growth': convert_percent,
                               'Jan Units': lambda x: pd.to_numeric(x, errors='coerce'),
                               'Active': lambda x: np.where(x == "Y", True, False)
                              })

Original: https://blog.csdn.net/qq_41404557/article/details/125898404
Author: Begin to change
Title: Pandas数据类型转换

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/672548/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球