我正在 kaggle 竞赛中处理一个有 550 万行的数据集。在熊猫中阅读.csv并处理它们需要数小时。
达斯克来了。Dask 速度很快,但有很多错误。
这是代码的片段,
#drop some columns
df = df.drop(['dropoff_latitude', 'dropoff_longitude','pickup_latitude', 'pickup_longitude', 'pickup_datetime' ], axis=1)
# In[ ]:
#one-hot-encode cat columns
df = dd.get_dummies(df.categorize())
# In[ ]:
#split train and test and export as csv
test_df = df[df['fare_amount'] == -9999]
train_df = df[df['fare_amount'] != -9999]
test_df.to_csv('df_test.csv')
train_df.to_csv('df_train.csv')
运行时 线条;
test_df.to_csv('df_test.csv')
train_df.to_csv('df_train.csv')
产生错误
ValueError: The columns in the computed data do not match the columns
in the provided metadata
什么可能导致这种情况,我该如何阻止它。
N.B First time using Dask.
文档字符串描述了从 CSV 读取时如何出现这种情况。很可能,如果你做了len(dd.read_csv(...))
,你早就看到了它,没有掉落、假人和火车分裂。错误消息可能会确切地告诉您哪些列是问题所在,以及预期类型与发现的类型。
发生的情况是,dask 从第一个文件的第一个块中猜测数据帧的 dtype。有时这并不能反映整个数据集中的类型:例如,如果一列碰巧在第一个块中没有值,则其类型将为float64
,因为 pandas 使用nan
作为 NULL 占位符。在这种情况下,您需要确定正确的 dtype,并使用dtype=
关键字将它们提供给read_csv
。请参阅 pandas 文档,了解dtype=
的典型用法以及数据解析转换的其他参数,这在加载时可能会有所帮助。