Python中DataFrame行级筛选:col1相同且col2含MSH和MDR的行
在DataFrame中筛选
col1值相同且col2同时包含'MSH'和'MDR'的行 需求说明
给定如下DataFrame,需要筛选出col1值相同且对应的col2列同时包含'MSH'和'MDR'的所有行,生成新的DataFrame。
原始DataFrame:
col1 col2 col3 C1234 MSH fever C1234 MDR fieber C4566 MSF malaria
预期输出:
col1 col2 col3 C1234 MSH fever C1234 MDR fieber
你已经通过字典推导式实现了分组收集:
terms = {k: [g['col2'].tolist(), g['col3'].tolist()] for k,g in df.groupby('col1')}
以下是直接在DataFrame层面实现的几种方法:
方法1:groupby + transform(推荐)
利用transform返回与原DataFrame同长度的布尔序列,标记符合条件的col1组:
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'col1': ['C1234', 'C1234', 'C4566'], 'col2': ['MSH', 'MDR', 'MSF'], 'col3': ['fever', 'fieber', 'malaria'] }) # 生成筛选掩码:每个col1组需同时包含'MSH'和'MDR' mask = df.groupby('col1')['col2'].transform( lambda x: {'MSH', 'MDR'}.issubset(x) ) # 过滤得到结果 result_df = df[mask] print(result_df)
方法2:先筛选有效col1再过滤
先找出所有满足条件的col1值,再用这些值过滤原DataFrame:
# 筛选出同时包含两个目标值的col1分组 valid_col1 = df.groupby('col1')['col2'].apply( lambda x: {'MSH', 'MDR'}.issubset(x) )[lambda x: x].index.tolist() # 过滤原DataFrame result_df = df[df['col1'].isin(valid_col1)] print(result_df)
方法3:交叉子集合并验证
通过分别筛选col2为'MSH'和'MDR'的子集,合并后取交集的col1值:
# 拆分出两个目标子集 msh_subset = df[df['col2'] == 'MSH'] mdr_subset = df[df['col2'] == 'MDR'] # 取两个子集col1的交集 valid_col1 = pd.merge(msh_subset[['col1']], mdr_subset[['col1']], on='col1')['col1'] # 过滤得到结果 result_df = df[df['col1'].isin(valid_col1)] print(result_df)
以上方法均无需手动构建字典,完全在DataFrame层面完成操作,更符合pandas的惯用写法,且效率更高。
内容的提问来源于stack exchange,提问作者rshar
相关产品推荐
相关产品推荐

