如何通过字典批量转换Dask DataFrame所有列的数据类型
Dask/Pandas DataFrame 批量按字典转换列类型方案
使用Dask读取CSV文件时,可直接在read_csv方法中传入dtype参数一次性指定各列数据类型,参考代码如下:
ddf = dd.read_csv("data/csvs/*.part", dtype=better_dtypes)
对于从pandas DataFrame转换得到的Dask DataFrame,同样支持传入类型字典一次性完成全列类型转换,和读取CSV时的使用体验完全一致。
错误写法说明
你之前尝试的写法存在问题:
# 错误写法 ddf = ddf.astype(better_dtypes).dtypes
问题出在末尾的.dtypes:这是DataFrame的属性,作用是返回各列当前数据类型的序列,你将这个属性的返回值赋值给ddf后,变量存储的就不再是Dask DataFrame对象,而是类型信息本身,完全无法得到类型转换后的数据集。
正确实现方法
直接去掉末尾的.dtypes调用即可,astype方法原生支持传入列名到目标类型的映射字典完成批量转换,该写法对pandas DataFrame、Dask DataFrame通用:
# 正确写法:传入提前定义的类型字典直接完成全列转换 ddf = ddf.astype(better_dtypes)
你提前定义的类型映射字典不需要做任何修改,可以直接传入使用:
better_dtypes = { "id1": "string[pyarrow]", "id2": "string[pyarrow]", "id3": "string[pyarrow]", "id4": "int64", "id5": "int64", "id6": "int64", "v1": "int64", "v2": "int64", "v3": "float64", }
注意事项
- 如果使用
string[pyarrow]这类基于pyarrow后端的数据类型,需要提前在环境中安装pyarrow依赖,否则会触发类型不存在的报错 - 类型转换完成后,可以单独执行
print(ddf.dtypes)校验各列类型是否符合预期,不要把该属性调用写到DataFrame的赋值语句中
内容的提问来源于stack exchange,提问作者Tinkinc
相关产品推荐
相关产品推荐

