如何筛选DataFrame中同一ID下含A或同时含B、C的行?
解决方法:Pandas筛选符合条件的行
这问题我之前也碰到过,用Pandas的分组和掩码组合就能轻松搞定,我给你一步步拆解下:
核心思路
我们需要筛选满足以下任一条件的行:
- 该行的
Value字段为A; - 该行对应的
ID,在整个数据集里同时存在Value为B和C的记录。
示例实现
1. 构造示例数据
先创建一个模拟的DataFrame方便演示:
import pandas as pd data = { 'ID': ['1', '1', '2', '2', '3', '3', '4', '4'], 'Value': ['A', 'B', 'B', 'C', 'A', 'D', 'C', 'D'] } df = pd.DataFrame(data)
2. 方法一:先提取目标ID再筛选
先找出所有同时包含B和C的ID,再结合Value=A的条件筛选:
# 分组检查每个ID是否同时包含B和C ids_with_bc = df.groupby('ID')['Value'].apply(lambda x: {'B', 'C'}.issubset(x)) # 提取符合条件的ID列表 target_ids = ids_with_bc[ids_with_bc].index.tolist() # 生成筛选掩码 mask = (df['Value'] == 'A') | (df['ID'].isin(target_ids)) # 应用掩码得到结果 filtered_df = df[mask]
3. 方法二:用transform直接生成掩码(更高效)
如果数据集较大,推荐用transform直接为每行生成布尔标记,避免中间数据结构:
# 标记每个ID是否存在B和C has_b = df.groupby('ID')['Value'].transform(lambda x: (x == 'B').any()) has_c = df.groupby('ID')['Value'].transform(lambda x: (x == 'C').any()) # 组合条件生成掩码 mask = (df['Value'] == 'A') | (has_b & has_c) filtered_df = df[mask]
输出结果
两种方法的输出都是:
ID Value 0 1 A 1 1 B 2 2 B 3 2 C 4 3 A
结果说明
- ID1包含
A,所以该行保留; - ID2同时存在
B和C,所以该ID下的所有行都保留; - ID3包含
A,保留; - ID4只有
C和D,不满足任一条件,因此被过滤。
内容的提问来源于stack exchange,提问作者aditya tandel
相关产品推荐
相关产品推荐

