You need to enable JavaScript to run this app. Pandas筛选指定列重复且VAF值在指定范围内的DataFrame方法
优惠活动
大模型
产品
解决方案
定价
更多

Pandas筛选指定列重复且VAF值在指定范围内的DataFrame方法

解决方案

实现思路

你已经完成了第一步筛选四列重复行的操作,接下来可以通过groupby分组 + 向量化计算的方式完成VAF阈值过滤,全程不用循环遍历行,效率远高于iterrows/itertuples方案。

完整代码

import pandas as pd
import numpy as np

# 第一步:筛选四列完全重复的行
df_dup = df[df.duplicated(subset = ['gene', 'lab_id', 'start', 'change'], keep = False)]

# 定义VAF相对差值阈值,25%即0.25,可按需调整
VAF_THRESHOLD = 0.25

def vaf_filter(group):
    vaf_arr = group['vaf'].values
    # 计算两两VAF的相对差值:|a-b| / min(a,b)
    min_vaf_pair = np.minimum(vaf_arr[:, None], vaf_arr)
    rel_diff = np.abs(vaf_arr[:, None] - vaf_arr) / min_vaf_pair
    # 规则:只要该行和组内至少1个其他行的相对差值小于等于阈值就保留(和自身差值恒为0,所以计数>=2即满足条件)
    keep_mask = (rel_diff <= VAF_THRESHOLD).sum(axis=1) >= 2
    return group[keep_mask]

# 按四列分组后应用过滤规则
result = df_dup.groupby(['gene', 'lab_id', 'start', 'change'], group_keys=False).apply(vaf_filter)

代码说明

  • 计算逻辑完全匹配示例需求:比如0.5和0.6的相对差值为0.1/0.5=20%,小于25%阈值会保留;0.5和0.99的相对差值为0.49/0.5=98%,超出阈值会被过滤,输出结果和你给出的期望完全一致。
  • 所有计算均为向量化操作,数据量越大对比循环方案的效率优势越明显。
  • 如果你的阈值是绝对差值(比如允许VAF差不超过0.25),只需要把rel_diff的计算逻辑修改为rel_diff = np.abs(vaf_arr[:, None] - vaf_arr)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 19:42:02