Pandas Multiindex Groupby совокупный столбец со значением из другого столбца

У меня есть кадр данных 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 (сумма) и сохранить значение S, соответствующее максимальной строке значения Q, что дает следующее:

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()]})

любые намеки?


person user1462620    schedule 20.09.2017    source источник


Ответы (2)


Один из способов — использовать 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
person Scott Boston    schedule 20.09.2017

Вот один из способов

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
person Zero    schedule 20.09.2017