在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
相关产品推荐
相关产品推荐

