2017-08-07 85 views
2

我在一個循環中,給了我像下面 df.groupby(['grp1','grp2'])['mycol'].sum()取最大值從多個分組數據大熊貓

基本上我讓我的分組元素的總和GROUPBY輸出。

grp1 grp2 
A  1 10 
B  1 20 
C  2 30 
D  3 40 
E  4 50 
     1 60 

現在下一次迭代中我可以得到一個像下面

grp1 grp2 
A  1 20 
D  3 40 
E  4 30 
     1 90 
F  1 40 

我想從每次迭代採取max分組DF。 所以第二迭代後我有這樣

grp1 grp2 
A  1 20 #because 20 was higher than 10 
B  1 20 #carried as it is 
C  2 30 #carried as it is 
D  3 40 #carried as it is (both were equal) 
E  4 30 #because 90+30 >50+60 
     1 90 
F  1 40 #added 

的輸出因此由最終我期間發言權5次迭代,其組達到峯值。 這聽起來很直接(跟蹤迄今爲止見過的最大值),但我沒有得到如何解決這個問題。 我試過df.groupby(['grp1','grp2'])['mycol'].sum().to_dict(),並且在閱讀新的df時做了更新字典的操作。 (只是一個嘗試,不知道如何保持字典更新)或者有一個簡單的pandas and np解決方案,我仍然不知道。

回答

3

您可以再次使用groupby! :-)

  1. 串聯的結果(pd.concat),
  2. 集團由索引(pd.Series.groupby, see level param),
  3. 骨料與.max()

中所示代碼:

res = pd.concat(list_of_iteration_results) 
res = res.groupby(level=['grp1', 'grp2']).max() 
+0

感謝,但是'max'知道如何添加然後比較呢? – pythonRcpp

+0

我不確定我是否理解你的後續問題:-) 如果你在連接之後檢查'res',你應該看到每個索引組合可以出現很多次,例如, [(A,1),(B,1),(A,1),(A,1),...]。這就是我們用'level'分組,然後'max'從每個組中取最大值。這是否回答你的問題,@pythonRcpp? – NTAWolf

+0

是的,我認爲'水平'是在做我關心的伎倆。謝謝,我會在我的樣本數據上運行它時接受答案。非常好的答案確實..謝謝 – pythonRcpp