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

如何使用Pandas drop_duplicates按子集去重并排除特定列值

解决按指定子集去重但忽略特定值记录的问题

没问题,我来帮你搞定这个需求!df.drop_duplicates()本身没有直接支持这种“排除特定行去重”的参数,但我们可以通过拆分数据分别处理的方式实现你想要的效果。

思路拆解

  • 把数据分成两部分分别处理:
    1. v3不等于'cat'的行:这部分按照[ID, v1]的子集进行去重
    2. v3等于'cat'的行:直接保留所有记录,不做去重处理
  • 最后将两部分结果合并,就得到了符合要求的数据集

代码实现

首先先构造你的示例数据:

import pandas as pd

data = {
    'v1': [148, 123, 123, 123],
    'v2': [8751704.0, 9082007.0, 9082007.0, 9082007.0],
    'v3': ['G', 'G', 'G', 'cat'],
    'ID': ['dog', 'dog', 'dog', 'cat']
}
df = pd.DataFrame(data)

然后执行分块处理和合并:

# 处理需要去重的分组:v3不等于'cat'的行按[ID, v1]去重
non_cat_part = df[df['v3'] != 'cat'].drop_duplicates(subset=['ID', 'v1'], keep='first')

# 保留所有v3等于'cat'的行,不做去重
cat_part = df[df['v3'] == 'cat']

# 合并两部分结果,重置索引(可选,让索引更整洁)
result_df = pd.concat([non_cat_part, cat_part]).reset_index(drop=True)

结果验证

处理后的result_df内容如下:

v1v2v3ID
1488751704.0Gdog
1239082007.0Gdog
1239082007.0catcat

完全符合你的预期:dog组的重复行被去除,而v3为cat的记录完整保留。

补充说明

  • 如果你想要类似inplace=True的修改原数据的效果,可以直接把合并结果赋值回原DataFrame:
    df = pd.concat([df[df['v3'] != 'cat'].drop_duplicates(subset=['ID', 'v1']), df[df['v3'] == 'cat']]).reset_index(drop=True)
    
  • drop_duplicates的keep参数可以根据需求调整:keep='first'保留第一条重复行,keep='last'保留最后一条,keep=False只保留完全唯一的行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:57:37