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

时间:2016-06-10 20:51:18

标签: python pandas memory-management

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

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

澄清:合并是指外部联接。每个表都有两行:产品和版本。我想检查左表中的产品和版本,仅右表和两个表。我用

做的
pd.merge(df1,df2,left_on=['product','version'],right_on=['product','version'], how='outer')

2 个答案:

答案 0 :(得分:12)

这似乎是dask设计的任务。从本质上讲,dask可以在核心外执行pandas操作,因此您可以使用不适合内存的数据集。 dask.dataframe API是pandas API的子集,因此不应该是学习曲线的大部分内容。有关其他一些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)

假设'product''version'是唯一的列,将merge替换为以下内容可能更有效:

df = dd.concat([df1, df2]).drop_duplicates()

我不完全确定这是否会更好,但显然在索引上没有合并的是" slow-ish"在dask,所以值得一试。

答案 1 :(得分:0)

我建议你使用像MySQL这样的RDBMS ......

所以你首先需要load your CSV files into tables

之后,您可以执行检查:

哪些产品和版本仅在左表中

SELECT a.product, a.version
FROM table_a a
LEFT JOIN table_b b
ON a.product = b.product AND a.version = b.version
WHERE b.product IS NULL;

哪些产品和版本仅在右表中

SELECT b.product, b.version
FROM table_a a
RIGHT JOIN table_b b
ON a.product = b.product AND a.version = b.version
WHERE a.product IS NULL;

中的

SELECT a.product, a.version
FROM table_a a
JOIN table_b b
ON a.product = b.product AND a.version = b.version;

Configure your MySQL Server,因此它使用至少2GB的RAM

您可能还想为表使用MyISAM引擎,在这种情况下请检查this

与熊猫相比,它可能会运行得更慢,但你肯定不会遇到内存问题。

另一种可能的解决方案:

  • 增加内存
  • 在多个群集节点上使用Apache Spark SQL(分布式DataFrame) - 虽然增加RAM会便宜得多