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

在Pandas DataFrame中基于多列去重,如何无需临时列高效保留目标值最小行?

高效实现基于多列组合去重并保留指定计算值最小行

需求说明

给定如下示例DataFrame:

A   B   C   D
0   1   1   3   9
1   1   2   4   8
2   1   3   5   7
3   1   3   4   6
4   1   4   5   5
5   1   4   6   4

需要基于A、B列的组合值去重,删除重复行中2*C + 3*D计算值较大的行,保留该值最小的行。

原实现需要创建临时列后手动删除,以下是无需额外维护临时列的更简洁高效方案:

方法1:链式assign+idxmin(推荐)

利用assign创建临时计算列(仅在链式操作中生效,不修改原DataFrame),直接通过idxmin获取每组中计算值最小的行索引:

result = df.loc[df.assign(S=2*df['C'] + 3*df['D']).groupby(['A', 'B'])['S'].idxmin()]

方法2:groupby+apply直接计算

通过apply在每组内直接计算目标值并取索引,无需额外列:

result = df.loc[df.groupby(['A', 'B']).apply(lambda g: (2*g['C'] + 3*g['D']).idxmin())]

方法3:排序后去重

先按A、B分组,再按目标计算值排序,最后保留每组第一行:

result = df.sort_values(
    by=['A', 'B'],
    key=lambda x: 2*df.loc[x.index, 'C'] + 3*df.loc[x.index, 'D']
).drop_duplicates(subset=['A', 'B'], keep='first')

输出结果

以上方法均会得到如下结果:

A   B   C   D
0   1   1   3   9
1   1   2   4   8
3   1   3   4   6
5   1   4   6   4

内容的提问来源于stack exchange,提问作者leofer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 08:05:27