如何基于ID出现次数与分组条件删除Pandas DataFrame行?
Pandas 按双条件优雅删除行
需求说明
需删除满足以下两个条件的行:
- 对应ID出现次数为2次
- 该行属于B组
给定数据中,索引为1和6的行需被删除。
原始数据及尝试代码
import pandas as pd data=pd.DataFrame({'id':[1,1,2,3,4,5,5], 'group':['A', 'B', 'A', 'B', 'A', 'A', 'B']}) # 曾尝试如下写法,但无法正常运行。 mask1 = [data.groupby(['id'])['group'].transform(len) > 1] mask2 = [data.group=='B'] data.isin([mask1 & mask2])
正确实现方案
方法一:分组变换+掩码过滤
import pandas as pd data = pd.DataFrame({'id':[1,1,2,3,4,5,5], 'group':['A', 'B', 'A', 'B', 'A', 'A', 'B']}) # 标记ID出现次数为2的行 mask_dup_id = data.groupby('id')['id'].transform('size') == 2 # 标记组为B的行 mask_group_b = data['group'] == 'B' # 保留不满足删除条件的行(对双条件取反) filtered_data = data[~(mask_dup_id & mask_group_b)] print(filtered_data)
代码解释
groupby('id')['id'].transform('size'):通过分组变换,为每一行匹配对应ID的出现次数,结果与原DataFrame行数一致mask_dup_id & mask_group_b:同时满足两个删除条件的行会被标记为True~运算符对布尔掩码取反,保留不需要删除的行
运行后输出结果:
id group 0 1 A 2 2 A 3 3 B 4 4 A 5 5 A
方法二:更简洁的链式写法
如果追求代码简洁,也可以合并为一行:
filtered_data = data[~((data.groupby('id')['id'].transform('size') == 2) & (data['group'] == 'B'))]
内容的提问来源于stack exchange,提问作者Henri
相关产品推荐
相关产品推荐

