如何在Pandas DataFrame聚合时关联最小值对应列的取值?
嘿,这个需求我太熟了!确实用groupby.agg就能优雅搞定,不用绕弯路。我给你一步步拆解,先从示例数据开始:
首先,假设你的DataFrame长这样:
import pandas as pd df = pd.DataFrame({ 'foo': ['A', 'A', 'B', 'B'], 'bar': ['X', 'X', 'Y', 'Y'], 'C': [3, 1, 4, 2], 'D': ['apple', 'banana', 'cherry', 'date'] })
用agg实现的优雅方案
你可以直接在groupby.agg里同时定义两个聚合操作:一个取C列的最小值,另一个提取对应行的D列值。这里提供两种写法,按需选择:
写法1:自定义函数(可读性更高)
def get_matching_D(group): # 找到当前组中C列最小值对应的行索引 min_c_index = group['C'].idxmin() # 返回该行的D列值 return group.loc[min_c_index, 'D'] # 分组聚合,给结果列起清晰的别名 result = df.groupby(['foo', 'bar']).agg( min_C=('C', 'min'), corresponding_D=('D', get_matching_D) )
写法2:Lambda表达式(更紧凑)
如果不想单独定义函数,用lambda一行搞定:
result = df.groupby(['foo', 'bar']).agg( min_C=('C', 'min'), corresponding_D=lambda g: g.loc[g['C'].idxmin(), 'D'] )
结果展示
运行后你会得到这样的结构化结果:
min_C corresponding_D foo bar A X 1 banana B Y 2 date
额外小提示
如果你的数据里存在多个行C列值都是最小值的情况,idxmin只会返回第一个出现的行的D值。如果需要把所有符合条件的D值都列出来,可以把函数改成这样:
def get_all_matching_D(group): min_c = group['C'].min() return group[group['C'] == min_c]['D'].tolist()
这样结果里的corresponding_D会是一个列表,包含所有匹配的D值。
内容的提问来源于stack exchange,提问作者Ruthger Righart
相关产品推荐
相关产品推荐

