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

如何从原DataFrame中筛选出不在多个控制DataFrame中的行?

筛选不在多个控制DataFrame中的行

你已经从原始DataFrame df 中拆分出两个控制DataFrame:

import pandas as pd
import numpy as np

# 分离对照样本
## 样本属于“对照”的条件:
## (i) 阳性对照:"mrna_assignment"列包含子串"pos_control"
## (ii) 阴性对照:"mrna_assignment"列包含子串"neg_control"
## (iii) 标准Affymetrix spike对照探针组:"category"列包含子串"control->affx"
## (iv) 反基因组背景探针:"category"列包含子串"control->bgp->antigenomic"

pos_neg_ctl_df = df.loc[((df["mrna_assignment"].str.contains("pos_control")) | (df["mrna_assignment"].str.contains("neg_control"))),:] 

probe_ctl_df = df.loc[((df["category"].str.contains("control->affx")) | (df["category"].str.contains("control->bgp->antigenomic"))),:] 

现在要创建sample_df,保留**既不在pos_neg_ctl_df也不在probe_ctl_df**的行,提供三种可行方案:

方案一:利用索引集合运算(高效简洁)

因为两个控制DataFrame都是从df切片而来,它们的索引是df的子集。合并两个控制DF的索引后,直接筛选df中不在该索引集合的行:

# 合并两个控制DataFrame的索引
control_indices = pos_neg_ctl_df.index.union(probe_ctl_df.index)
# 筛选非控制行
sample_df = df.loc[~df.index.isin(control_indices)]
# 设置"Gene Symbol"为索引(与你原有操作对齐)
sample_df = sample_df.set_index("Gene Symbol")

方案二:直接基于原始条件取反(一步到位)

不需要先创建中间控制DF,直接把所有对照条件合并后取反,代码更简洁:

# 定义所有对照的筛选条件(na=False处理NaN值)
control_cond = (
    df["mrna_assignment"].str.contains("pos_control|neg_control", na=False) |
    df["category"].str.contains("control->affx|control->bgp->antigenomic", na=False)
)
# 取反筛选得到样本数据
sample_df = df.loc[~control_cond]
sample_df = sample_df.set_index("Gene Symbol")

方案三:延续merge思路(兼容原有操作习惯)

先合并两个控制DF,再用你熟悉的left merge方法筛选:

# 合并两个控制DataFrame
combined_ctl_df = pd.concat([pos_neg_ctl_df, probe_ctl_df])
# 执行left merge并筛选仅在原df中存在的行
merged_control = df.reset_index().merge(combined_ctl_df, how='left', indicator=True)
sample_df = merged_control[merged_control['_merge'] == 'left_only']
# 恢复索引
sample_df = sample_df.set_index("Gene Symbol")

方案对比

  • 方案一:索引操作速度最快,适合大数据量场景;
  • 方案二:无需维护中间控制DF,代码最精简;
  • 方案三:延续你原本的merge逻辑,易理解上手。

内容的提问来源于stack exchange,提问作者melolilili

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 19:27:23