2017-08-07 59 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