You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:34:43