如何基于另一列筛选DataFrame中含指定全部处理的ID对应多行数据
解决方法
要筛选出包含所有5种处理(A、B、C、D、E)的id对应的子数据集,用Pandas可以这样实现:
方法一:精确匹配所需处理集合
先明确我们要检查的处理类型,再通过分组验证每个id是否覆盖全部处理:
import pandas as pd # 假设你的原始数据是这个DataFrame df = pd.DataFrame({ 'id': [1,1,1,1,1,2,2,2], 'treatment': ['A','B','C','D','E','A','B','C'] }) # 定义必须包含的处理集合 required_treatments = {'A', 'B', 'C', 'D', 'E'} # 分组筛选出符合条件的id:检查每个id的处理是否包含所有必要项 valid_ids = df.groupby('id')['treatment'].apply( lambda group: required_treatments.issubset(group.unique()) ).loc[lambda x: x].index # 用筛选出的id过滤原数据集 result_df = df[df['id'].isin(valid_ids)]
运行后result_df的输出就是你想要的结果:
| id | treatment |
|---|---|
| 1 | A |
| 1 | B |
| 1 | C |
| 1 | D |
| 1 | E |
方法二:基于处理数量的快速筛选(适合无重复处理的数据集)
如果你的数据中每个id的处理没有重复值,可以用统计唯一处理数量的方式简化操作:
# 先确保每个id的处理无重复(如果数据有重复的话) df_unique = df.drop_duplicates(subset=['id', 'treatment']) # 筛选出拥有5种唯一处理的id valid_ids = df_unique.groupby('id')['treatment'].nunique().loc[lambda x: x == 5].index # 生成结果数据集 result_df = df[df['id'].isin(valid_ids)]
这个方法效率更高,适合处理大规模数据集。
内容的提问来源于stack exchange,提问作者Bio_farmer
相关产品推荐
相关产品推荐

