2015-09-22 41 views
1

我的DataFrame 3字段是账户,月份和薪水。熊猫groupby +转换需要6亿条记录的小时数

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 

我这样做对客户和月GROUPBY和计算工资的总和组。然后删除重复。

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 

它非常适用几个记录。我为600万条记录尝试了相同的,并且自4-5小时以来一直在进行中。最初当我使用pd.read_csv()获取60 GB RAM的数据加载数据时,直到1-2小时RAM使用率在90至120 GB之间。经过3个小时的过程需要236 GB的RAM,并且仍在运行。

请提出建议,如果有任何其他更快的方式可用于此。

编辑: 现在15分钟在df.groupby([ '账户', '月'],排序= FALSE)[ '工资']和()

+2

不应该的声明仅仅是:'df.groupby([ '账户', '月'])Salary.sum()'? – Alexander

+0

@Alexander我正在尝试它,不知道如果两者都不同 – Vipin

+0

@Alexander我得到一个错误“与帧索引插入列不兼容索引”,我运行它像MyDataFrame ['salary'] = MyDataFrame.groupby(['' sum() – Vipin

回答

2

只是跟进chrisb的答案和亚历山大的评论,你确实会走出的.sum().agg('sum')方法的详细性能。这里有一个Jupyter %%timeit输出三个:

Timeit results on groupby methods

所以,这chrisb答案和亚历山大提的还有约两倍的速度在你很小的例子的数据集。

此外,根据Pandas API documentation,加入kwarg sort=False也将有助于表现。所以,你的groupby应该看起来像df.groupby(['account', 'month'], sort=False)['Salary'].sum()。事实上,当我运行它时,它比上图中显示的运行速度快大约10%。

+0

所有的答案真的有帮助选择它因为排序= False – Vipin

2

除非我误解的东西,你真的在​​做一个aggregation - transform是为了当你需要在形状的数据作为原始框架。这应该更快一些,并且一步完成。

df.groupby(['account', 'month'])['Salary'].agg('sum') 
+0

我会试试这个,让你知道结果 – Vipin