2015-09-22 37 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