Pandas groupby +转换需要数小时才有6亿条记录

时间:2015-09-22 16:24:46

标签: python-2.7 pandas group-by ipython

我的DataFrame 3字段是帐户,月份和工资。

account month              Salary
1       201501             10000
2       201506             20000
2       201506             20000
3       201508             30000
3       201508             30000
3       201506             10000
3       201506             10000
3       201506             10000
3       201506             10000

我在账户和月份上进行分组并计算组的工资总额。然后删除重复项。

MyDataFrame['salary'] = MyDataFrame.groupby(['account'], ['month'])['salary'].transform(sum)
MyDataFrame = MyDataFrame.drop_duplicates()

期望输出如下:

account month              Salary
1       201501             10000
2       201506             40000
3       201508             60000
3       201506             40000

适用于少数记录。我尝试了相同的 6亿条记录,并且它在4-5小时后正在进行中。最初,当我使用pd.read_csv()数据加载数据获得60 GB RAM时,直到1-2小时RAM使用量介于90到120 GB之间。 3个小时后,进程占用236 GB RAM并且仍在运行。

请建议是否有更快捷的替代方法。

编辑: df.groupby中的现在15分钟(['帐户','月'],排序=错误)['薪水']。 sum()

2 个答案:

答案 0 :(得分:2)

为了跟进chrisb的回答和Alexander的评论,你确实会从.sum().agg('sum')方法中获得更多的表现。这是三个的Jupyter %%timeit输出:

Timeit results on groupby methods

因此,chrisb和Alexander提到的答案在您的小型示例数据集上的速度提高了一倍。

此外,根据Pandas API documentation,添加kwarg sort=False也有助于提升效果。所以,你的groupby应该看起来像df.groupby(['account', 'month'], sort=False)['Salary'].sum()。实际上,当我运行它时,它比上图中显示的运行速度快10%左右。

答案 1 :(得分:2)

可能值得下载Pandas 0.17.0的开发版本。他们正在解锁控制多线程的GIL。它将在groupby中本地实现,而这篇博客文章建议在群体平均示例上加速3倍。

http://continuum.io/blog/pandas-releasing-the-gil

http://pandas.pydata.org/