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
相关产品推荐
相关产品推荐

