【发布时间】:2021-10-09 08:40:05
【问题描述】:
我在 AWS s3 中保存了许多 CSV 文件,其中包含相同的第一组列和许多可选列。我不想一个一个地下载它们,而是使用pd.concat 来阅读它,因为这需要很多时间并且必须适合计算机内存。相反,我正在尝试使用 Dask 来加载和汇总所有这些文件,而应将可选列视为零。
如果我可以使用相同的所有列:
import dask.dataframe as dd
addr = "s3://SOME_BASE_ADDRESS/*.csv"
df = dd.read_csv(addr)
df.groupby(["index"]).sum().compute()
但它不适用于列数不同的文件,因为 Dask 假设它可以将第一列用于所有文件:
文件“.../lib/python3.7/site-packages/pandas/core/internals/managers.py”,第 155 行,在 set_axis '值有 {new} 个元素'.format(old=old_len, new=new_len)) ValueError:长度不匹配:预期轴有 64 个元素,新值有 62 个元素
根据this thread,我可以预先读取所有标题(例如,在我生成并保存所有小 CSV 时写入它们)或使用类似这样的东西:
df = dd.concat([dd.read_csv(f) for f in filelist])
我想知道这个解决方案是否真的比直接使用 pandas 更快/更好?一般来说,我想知道解决此问题的最佳(主要是最快)方法是什么?
【问题讨论】:
标签: pandas csv amazon-s3 dask dask-distributed