我的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()
答案 0 :(得分:2)
为了跟进chrisb的回答和Alexander的评论,你确实会从.sum()
和.agg('sum')
方法中获得更多的表现。这是三个的Jupyter %%timeit
输出:
因此,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倍。