Pandas如何删除ID_Dets分组下ID_Dets_2含多唯一值的所有行
Pandas 分组过滤清洗实现
你要实现的清洗规则可以直接通过pandas内置的分组筛选能力完成,不需要写循环逐行判断。
基础实现(代码简洁易读)
直接使用groupby配套的filter方法,按分组维度判断是否保留:
# df是你原始的DataFrame数据集 cleaned_df = df.groupby('ID_Dets', group_keys=False).filter( lambda group: group['ID_Dets_2'].nunique() == 1 )
逻辑说明
- 按
ID_Dets字段对全量数据拆分分组 - 对每个分组单独统计
ID_Dets_2字段的去重后取值数量:nunique()默认自动忽略空值统计唯一值个数,如果你的场景需要把空值也算作一个独立取值,可以加参数dropna=False - 唯一值数量等于1的分组整组保留,唯一值数量大于1的分组整组删除,完全匹配你的规则要求
- 对应你给出的示例:
ID_Dets=0的分组下ID_Dets_2有0、1两个取值,nunique()返回2,不满足保留条件,对应索引16、17、18、19的4行会被全部过滤;其余分组的ID_Dets_2均只有1个唯一值,所有行正常保留。
大数据量优化写法
如果你的数据集行数达到百万级以上,用transform实现的版本性能会比filter更高,逻辑完全等价:
# 先给每一行标记其所属分组是否符合保留条件 keep_mask = df.groupby('ID_Dets')['ID_Dets_2'].transform('nunique') == 1 cleaned_df = df[keep_mask]
内容的提问来源于stack exchange,提问作者keynesiancross
相关产品推荐
相关产品推荐

