【问题标题】:Pandas Multiindex Groupby aggregate column with value from another columnPandas Multiindex Groupby 聚合列与另一列的值
【发布时间】:2018-03-01 19:55:33
【问题描述】:

我有一个带有多索引的 pandas 数据框,我想在其中聚合重复的键行,如下所示:

import numpy as np
import pandas as pd
df = pd.DataFrame({'S':[0,5,0,5,0,3,5,0],'Q':[6,4,10,6,2,5,17,4],'A':
                  ['A1','A1','A1','A1','A2','A2','A2','A2'],
                  'B':['B1','B1','B2','B2','B1','B1','B1','B2']})
df.set_index(['A','B'])

    Q  S
A  B        
A1 B1   6  0
   B1   4  5
   B2  10  0
   B2   6  5
A2 B1   2  0
   B1   5  3
   B1  17  5
   B2   4  0

我想按此数据框分组以聚合 Q 值(总和)并保留与 Q 值的最大行相对应的 S 值,从而产生:

df2 = pd.DataFrame({'S':[0,0,5,0],'Q':[10,16,24,4],'A':
                   ['A1','A1','A2','A2'],
                  'B':['B1','B2','B1','B2']})
df2.set_index(['A','B'])

        Q  S
A  B        
A1 B1  10  0
   B2  16  0
A2 B1  24  5
   B2   4  0

我尝试了以下方法,但没有成功:

df.groupby(by=['A','B']).agg({'Q':'sum','S':df.S[df.Q.idxmax()]})

有什么提示吗?

【问题讨论】:

    标签: python pandas group-by aggregate multi-index


    【解决方案1】:

    一种方法是使用agg、apply和join:

    g = df.groupby(['A','B'], group_keys=False)
    g.apply(lambda x: x.loc[x.Q == x.Q.max(),['S']]).join(g.agg({'Q':'sum'}))
    

    输出:

           S   Q
    A  B        
    A1 B1  0  10
       B2  0  16
    A2 B1  5  24
       B2  0   4
    

    【讨论】:

      【解决方案2】:

      这是一种方法

      In [1800]: def agg(x):
            ...:     m = x.S.iloc[np.argmax(x.Q.values)]
            ...:     return pd.Series({'Q': x.Q.sum(), 'S': m})
            ...:
      
      In [1801]: df.groupby(['A', 'B']).apply(agg)
      Out[1801]:
              Q  S
      A  B
      A1 B1  10  0
         B2  16  0
      A2 B1  24  5
         B2   4  0
      

      【讨论】:

        猜你喜欢
        • 2017-04-06
        • 2017-07-02
        • 2020-02-05
        • 1970-01-01
        • 2021-11-01
        • 2019-10-12
        • 2017-07-20
        • 2019-03-04
        • 2017-12-25
        相关资源
        最近更新 更多