pandas groupby分组取V列最大值对应的B列值的实现方法咨询
示例数据构造(可直接复现测试)
import pandas as pd df = pd.DataFrame([ ["MHQ","Q",0.5192],["MMO","Q",0.4461],["MTR","Q",0.5385],["MVM","Q",0.351],["NCR","Q",0.0704], ["MHQ","E",0.5435],["MMO","E",0.4533],["MTR","E",-0.6716],["MVM","E",0.3684],["NCR","E",-0.0278], ["MHQ","U",0.2712],["MMO","U",0.1923],["MTR","U",0.3833],["MVM","U",0.1355],["NCR","U",0.1058] ], columns=["A","B","V"])
可用解法
你之前用groupby+agg无法得到预期结果,是因为agg仅针对分组内单列做聚合计算,无法直接关联同分组其他列的对应取值,以下是三种简洁实现方案:
方案1:idxmax定位法(无重复最大值场景最优)
通过groupby后V列的idxmax()直接拿到每组最大值对应的行索引,一次定位取值:
res = df.loc[df.groupby('A')['V'].idxmax(), ['A', 'B']].set_index('A')
输出结果:
B A MHQ E MMO E MTR Q MVM E NCR U
方案2:排序取首行法
先按V列降序排序,再按A分组取每组第一行,效果和idxmax一致:
res = df.sort_values('V', ascending=False).groupby('A').head(1)[['A', 'B']].set_index('A')
方案3:transform匹配法(适配多最大值场景)
如果同一个A分组下存在多个相同的V最大值,需要返回所有对应的B值,用这个方案:
res = df[df['V'] == df.groupby('A')['V'].transform('max')][['A', 'B']].set_index('A')
内容的提问来源于stack exchange,提问作者TPM
相关产品推荐
相关产品推荐

