使用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之前)均为整数/浮点数,因此可以100%进行转换。我也确定这些值是有效的。
我猜想这与Python关于数据转换的安全政策有关。
是否有解决此问题的方法或任何强制转换的方法?
答案 0 :(得分:1)
使用dic={'key':1}
df=pd.DataFrame()
df['a'][1] = str(dic)
从csv读取数据框时,结果将在数据框的第一行中显示列名称。
这就是为什么您会得到错误
ValueError:无法将字符串转换为float:'colA'
因为names=header
是列的第一个值。
因此,只需将colA
参数添加到header=0
(以显式使用第一行作为列名)来解决此问题:
read_csv