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

如何按复杂条件删除Pandas DataFrame中的重复行?

按特定条件删除Pandas DataFrame重复行

原始DataFrame

idx  a    b    c   d   e  f
1    1   ss1   0   25  A  B
2    3   ss7   0   25  A  B
3    5   ss5   0   12  C  D
4    11  im3   0   12  C  D
5    5   ss8   0   50  C  K
6    9   im8   0   5   F  G
7    8   ix6   0   5   F  G

重复行定义与保留规则

  • 重复判定:当d、e、f三列值完全匹配时,视为重复行(对应subset=['d', 'e', 'f'])
  • 保留规则:
    • 若重复行的b列均以ss开头,任意删除一行
    • 若重复行中一个b列以ss开头、另一个不是,保留ss开头的行
    • 若重复行的b列都不以ss开头,任意保留一行

解决方案代码

import pandas as pd

# 构建原始数据
data = {
    'idx': [1,2,3,4,5,6,7],
    'a': [1,3,5,11,5,9,8],
    'b': ['ss1','ss7','ss5','im3','ss8','im8','ix6'],
    'c': [0,0,0,0,0,0,0],
    'd': [25,25,12,12,50,5,5],
    'e': ['A','A','C','C','C','F','F'],
    'f': ['B','B','D','D','K','G','G']
}
df = pd.DataFrame(data)

# 标记b列是否以ss开头
df['is_ss'] = df['b'].str.startswith('ss')

# 分组排序后保留目标行:优先保留ss开头的,无则任意留一行
result = df.sort_values('is_ss', ascending=False).groupby(['d','e','f'], as_index=False).last()

# 清理辅助列并按原始idx排序
result = result.drop('is_ss', axis=1).sort_values('idx')

print(result)

预期输出

idx  a    b  c   d  e  f
2    3  ss7  0  25  A  B
3    5  ss5  0  12  C  D
5    5  ss8  0  50  C  K
7    8  ix6  0   5  F  G

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:53:36