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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:05:18