python - Pandas Multiindex Groupby 聚合列与另一列的值

标签 python pandas group-by aggregate multi-index

我有一个带有多索引的 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()]})

有什么提示吗?

最佳答案

一种方法是使用 aggapplyjoin:

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

关于python - Pandas Multiindex Groupby 聚合列与另一列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46327397/

相关文章:

python - 如何使用python将数据列表、数组插入数据库MySQL?

python - Pandas 数据帧中任意两连续行之间差异的平均值

mysql 分组依据和最大值

Python Pandas 将列添加到多索引 GroupBy DataFrame

python - 按日期时间间隔计算记录数

python - 成对距离在稀疏矩阵上失败,并显示无信息的错误消息

python - 有没有办法让 numpy.argmin() 和 min() 一样快?

python - Kivy:AttributeError 具有在 kv 文件中定义的属性

python - 用两个值重置索引

python - 从 pandas 列动态创建字符串