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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:55:48