【发布时间】:2015-09-17 16:13:19
【问题描述】:
我对 Python 和 Pandas 都很陌生,并试图找出在大约 1100 万行的左侧数据集和大约 160K 行和四列的右侧数据集之间执行庞大的左外连接的最快方法。这应该是多对一的情况,但如果右侧有重复的行,我希望加入不会引发错误。我在具有 8 Gb RAM 的 Windows 7 64 位系统上使用 Canopy Express,我对此非常坚持。
这是迄今为止我整理的代码模型:
import pandas as pd
leftcols = ['a','b','c','d','e','key']
leftdata = pd.read_csv("LEFT.csv", names=leftcols)
rightcols = ['x','y','z','key']
rightdata = pd.read_csv("RIGHT.csv", names=rightcols)
mergedata = pd.merge(leftdata, rightdata, on='key', how='left')
mergedata.to_csv("FINAL.csv")
这适用于小文件,但会在我的系统上产生 MemoryError,文件大小比我实际需要合并的文件大小小两个数量级。
我一直在浏览相关问题(one、two、three),但没有一个答案能真正解决这个基本问题 - 或者如果他们这样做,它的解释还不够好,我无法识别潜在的解决方案。接受的答案无济于事。我已经在 64 位系统上并使用最新的稳定版 Canopy(1.5.5 64 位,使用 Python 2.7.10)。
避免此 MemoryError 问题的最快和/或最 Python 的方法是什么?
【问题讨论】:
-
最pythonic的方法是获取更多内存。不认真。 Pandas 始终将您的数据保存在内存中。如果您的文件太大,您根本无法使用 pandas。
-
如果具有 8 GB RAM 的系统不足以合并两个文件,每个文件大小是我需要的文件大小的 1/100,那么多少 RAM 才足够? 1TB?我需要组装多少台超级计算机?必须有一种不同的方式来使用更少的内存。如果不是熊猫,怎么办?
-
AFAIK,所有加入/合并操作都可以通过排序合并完成。所以没有必要把事情记在内存里。
-
您可能在合并“键”中有重复的值,这会导致输出中此类行的笛卡尔积
-
当你说“接受的答案没有帮助”时,你的意思是包括
pd.concat答案吗?尝试在调用中将index_col='key'设置为read_csv,然后连接(或加入,如果这抱怨重复索引)?
标签: python python-2.7 join pandas canopy