在Pandas中连接两个大型数据集的最佳方法

Nic*_*ick 9 python memory-management pandas

我正在从两个需要加入的不同数据库中下载两个数据集.当我将它们存储为CSV时,它们中的每一个分别约为500MB.分别适合内存,但当我加载两个时,我有时会得到一个内存错误.当我尝试将它们与熊猫合并时,我肯定会遇到麻烦.

对它们进行外连接的最佳方法是什么,这样我就不会出现内存错误?我手头没有任何数据库服务器,但如果有帮助,我可以在我的计算机上安装任何类型的开源软件.理想情况下,我仍然只想在熊猫中解决它,但不确定这是否可行.

澄清一下:合并是指外连接.每个表都有两行:产品和版本.我想检查左表中的产品和版本,仅右表和两个表.我做了一个

pd.merge(df1,df2,left_on=['product','version'],right_on=['product','version'], how='outer')
Run Code Online (Sandbox Code Playgroud)

roo*_*oot 16

这似乎是一项dask专为此设计的任务.从本质上讲,dask可以在pandas核心外进行操作,因此您可以使用不适合内存的数据集.该dask.dataframeAPI是的一个子集pandasAPI,所以不应该有太大的学习曲线.有关其他一些DataFrame特定详细信息,请参阅Dask DataFrame Overview页面.

import dask.dataframe as dd

# Read in the csv files.
df1 = dd.read_csv('file1.csv')
df2 = dd.read_csv('file2.csv')

# Merge the csv files.
df = dd.merge(df1, df2, how='outer', on=['product','version'])

# Write the output.
df.to_csv('file3.csv', index=False)
Run Code Online (Sandbox Code Playgroud)

假设'product'并且'version'是唯一的列,替换mergewith 可能更有效:

df = dd.concat([df1, df2]).drop_duplicates()
Run Code Online (Sandbox Code Playgroud)

我不完全确定这是否会更好,但显然未在索引上进行的合并是"慢速" dask,因此值得一试.

  • 这就是`dask`的全部意义.它执行非核心操作,因此您可以处理不适合内存的数据.它本质上将方便数据集的大小从"适合内存"扩展到"适合磁盘". (2认同)
  • 达斯克(Dask)似乎非常越野车。即使是简单的合并操作也会给出错误消息。列名的末尾包含\ r等。是否有其他选择? (2认同)