在使用 Pandas/Dask 处理大数据集后,我将生成的数据框保存到 csv 文件中。
当我尝试使用 Dask 读取输出 CSV 时,默认情况下数据类型都是对象。每当我尝试使用传统方法转换它们时(例如,在读取时定义数据类型或在读取后重新分配它们),我总是收到有关转换的错误,如下所示:
# ATTEMPT 1
import dask.dataframe as dd
header = ['colA', 'colB', ...]
dtypes = {'colA' : 'float', ...}
df = dd.read_csv('file.csv', names=header, dtype=types)
> TypeError: Cannot cast array from dtype('O') to dtype('float64') according to the rule 'safe'
> ...
> ValueError: could not convert string to float: 'colA'
-----------------------------------------------------------------------------------
# ATTEMPT 2
import dask.dataframe as dd
header = ['colA', 'colB', ...]
df = dd.read_csv('file.csv', names=header)
df['colA'] = df['colA'].astype(str).astype(float)
> ...
> File "/home/routar/anaconda3/lib/python3.6/site-packages/pandas/core/dtypes/cast.py", line 730, in astype_nansafe
> ValueError: could not convert string to float: 'colA'
原始数据框中的所有属性(在转换为 CSV 之前)都是整数/ float ,因此转换是 100% 可能的。我也确定这些值是有效的。
我猜这与 Python 关于数据转换的安全策略有关。
是否有解决此问题的方法或任何强制转换的方法?
最佳答案
当您使用 names=header
从 csv 读取数据帧时,您会在数据帧的第一行中得到列名。
这就是你得到错误的原因
ValueError: could not convert string to float: 'colA'
因为 colA
是您列的第一个值。
因此只需将 header=0
参数添加到 read_csv
(明确使用第一行作为列名)即可解决问题:
df = dd.read_csv('file.csv', names=header, dtype=types, header=0)
关于python - 无法转换数据框列数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52410696/