如何在Python Pandas中按ID聚合DataFrame并按规则处理列值去重?
Python Pandas 按指定规则对DataFrame去重
问题背景
现有如下Pandas DataFrame:
ID | COL1| COL2 | COL3 ----------|------|------ 123 | XXX | 0 | 1 123 | XXX | 1 | 1 444 | ABC | 1 | 1 444 | ABC | 1 | 1 555 | PPP | 0 | 0
需按以下规则完成去重:
- 每个ID分组内,若COL2或COL3中存在至少一个1,则最终这两列的值为1(无需考虑0的出现次数);
- 保留DataFrame中的所有其他列;
- 每个ID对应的COL1值唯一,最终结果中同一ID仅保留一行对应COL1的记录。
期望输出结果:
ID | COL1| COL2 | COL3 ----|-----|------|----- 123 | XXX | 1 | 1 444 | ABC | 1 | 1 555 | PPP | 0 | 0
实现方案
通过groupby分组结合聚合函数即可实现需求,具体代码如下:
示例代码
import pandas as pd # 构造原始数据(包含额外列示例) df = pd.DataFrame({ 'ID': [123, 123, 444, 444, 555], 'COL1': ['XXX', 'XXX', 'ABC', 'ABC', 'PPP'], 'COL2': [0, 1, 1, 1, 0], 'COL3': [1, 1, 1, 1, 0], 'OTHER_COL1': ['A', 'A', 'B', 'B', 'C'], 'OTHER_COL2': [10, 10, 20, 20, 30] }) # 定义聚合规则:COL2、COL3取最大值(只要有1就返回1) agg_spec = {'COL2': 'max', 'COL3': 'max'} # 为其他需要保留的列添加聚合规则(这里取分组内第一个值,可根据实际调整) for col in df.columns: if col not in ['ID', 'COL1', 'COL2', 'COL3']: agg_spec[col] = 'first' # 分组聚合得到最终结果 result = df.groupby(['ID', 'COL1'], as_index=False).agg(agg_spec) print(result)
关键逻辑说明
- 分组键选择:使用
['ID', 'COL1']作为分组键,确保同一ID下的COL1值唯一,满足需求3; - COL2/COL3聚合:
max()函数刚好匹配需求1——只要分组内存在1,最大值就是1;全0则返回0; - 其他列处理:若同一分组内其他列的值一致,用
first()/last()均可;若存在不同值,可根据业务需求替换为mean()(数值列)、join()(文本列)或自定义聚合函数。
内容的提问来源于stack exchange,提问作者unbik
相关产品推荐
相关产品推荐

