- 深入浅出Pandas:利用Python进行数据处理与分析
- 李庆辉
- 843字
- 2021-07-16 16:52:17
5.2 数据类型转换
在开始数据分析前,我们需要为数据分配好合适的类型,这样才能够高效地处理数据。不同的数据类型适用于不同的处理方法。之前的章节中介绍过,加载数据时可以指定数据各列的类型:
# 对所有字段指定统一类型 df = pd.DataFrame(data, dtype='float32') # 对每个字段分别指定 df = pd.read_excel(data, dtype={'team': 'string', 'Q1': 'int32'})
本节来介绍如何把数据转换成我们所期望的类型。
5.2.1 推断类型
Pandas可以用以下方法智能地推断各列的数据类型,会返回一个按推断修改后的DataFrame。如果需要使用这些类型的数据,可以赋值替换。
# 自动转换合适的数据类型 df.infer_objects() # 推断后的DataFrame df.infer_objects().dtypes ''' name object team object Q1 int64 Q2 int64 Q3 int64 Q4 int64 dtype: object ''' # 推荐这个新方法,它支持string类型 df.convert_dtypes() # 推断后的DataFrame df.convert_dtypes().dtypes ''' name string team string Q1 Int64 Q2 Int64 Q3 Int64 Q4 Int64 dtype: object '''
5.2.2 指定类型
pd.to_XXX系统方法可以将数据安全转换,errors参数可以实现无法转换则转换为兜底类型:
# 按大体类型推定 m = ['1', 2, 3] s = pd.to_numeric(s) # 转成数字 pd.to_datetime(m) # 转成时间 pd.to_timedelta(m) # 转成时间差 pd.to_datetime(m, errors='coerce') # 错误处理 pd.to_numeric(m, errors='ignore') pd.to_numeric(m errors='coerce').fillna(0) # 兜底填充 pd.to_datetime(df[['year', 'month', 'day']]) # 组合成日期
转换为数字类型时,默认返回的dtype是float64还是int64取决于提供的数据。使用downcast参数获得向下转换后的其他类型。
# 最低期望 pd.to_numeric(m, downcast='integer') # 至少为有符号int数据类型 # array([1, 2, 3], dtype=int8) pd.to_numeric(m, downcast='signed') # 同上 # array([1, 2, 3], dtype=int8) pd.to_numeric(m, downcast='unsigned') # 至少为无符号int数据类型 # array([1, 2, 3], dtype=uint8) pd.to_numeric(m, downcast='float') # 至少为float浮点类型 # array([1., 2., 3.], dtype=float32)
可以应用在函数中:
df = df.select_dtypes(include='number') # 应用函数 df.apply(pd.to_numeric)
5.2.3 类型转换astype()
astype()是最常见也是最通用的数据类型转换方法,一般我们使用astype()操作数据转换就可以了。
df.Q1.astype('int32').dtypes # dtype('int32') df.astype({'Q1': 'int32','Q2': 'int32'}).dtypes ''' Q1 int32 Q2 int32 Q3 int64 Q4 int64 dtype: object '''
以下是一些使用示例:
df.index.astype('int64') # 索引类型转换 df.astype('int32') # 所有数据转换为int32 df.astype({'col1': 'int32'}) # 指定字段转指定类型 s.astype('int64') s.astype('int64', copy=False) # 不与原数据关联 s.astype(np.uint8) df['name'].astype('object') data['Q4'].astype('float') s.astype('datetime64[ns]') data['状态'].astype('bool')
当数据的格式不具备转换为目标类型的条件时,需要先对数据进行处理。例如"89.3%"是一个字符串,要转换为数字,要先去掉百分号:
# 将"89.3%"这样的文本转为浮点数 data.rate.apply(lambda x: x.replace('%', '')).astype('float')/100
5.2.4 转为时间类型
我们通常使用pd.to_datetime()和s.astype('datetime64[ns]')来做时间类型转换,第14章会专门介绍这两个函数。
t = pd.Series(['20200801', '20200802']) t ''' 0 20200801 1 20200802 dtype: object ''' pd.to_datetime(t) ''' 0 2020-08-01 1 2020-08-02 dtype: datetime64[ns] ''' t.astype('datetime64[ns]') ''' 0 2020-08-01 1 2020-08-02 dtype: datetime64[ns] '''
5.2.5 小结
本节介绍的数据类型匹配和转换是高效处理数据的前提。每种数据类型都有自己独有的方法和属性,所以数据类型的转换是非常有必要的。