如何使用Pandas drop_duplicates按子集去重并排除特定列值
解决按指定子集去重但忽略特定值记录的问题
没问题,我来帮你搞定这个需求!df.drop_duplicates()本身没有直接支持这种“排除特定行去重”的参数,但我们可以通过拆分数据分别处理的方式实现你想要的效果。
思路拆解
- 把数据分成两部分分别处理:
- v3不等于'cat'的行:这部分按照
[ID, v1]的子集进行去重 - v3等于'cat'的行:直接保留所有记录,不做去重处理
- 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内容如下:
| v1 | v2 | v3 | ID |
|---|---|---|---|
| 148 | 8751704.0 | G | dog |
| 123 | 9082007.0 | G | dog |
| 123 | 9082007.0 | cat | cat |
完全符合你的预期: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
相关产品推荐
相关产品推荐

