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

Pandas提取指定元素成对对比结果数量不符的排查求助

Pandas筛选query-reference成对对比结果不足的问题排查

我有一个包含query与reference成对对比、距离列及元数据的Pandas DataFrame,已从主DataFrame筛选得到新的DataFrame。现在想要获取新DataFrame的query列中19个元素的所有成对对比(即其中一个元素在主DataFrame的query列,另一个在reference列)。

使用Python 3.10.6与Pandas 1.5.0编写了如下函数:

def metadata_def_epi(df_metadata, df_selection_ur):

    df_selection_ur_list = df_selection_ur["query"].values.tolist()
    
    mask = df_metadata["query"].isin(df_selection_ur_list) & df_metadata["reference"].isin(df_selection_ur_list)
    
    df_out = df_metadata[mask]

    return df_out

函数可正常运行,但仅得到136组成对对比,而按公式n(n-1)/2计算(n=19)预期应为171组,请问遗漏了什么?


补充数据示例

主DataFrame结构与部分数据

FIELD1queryreferenceCoreAccessorypmatchpatient_id_queryCollection_date_queryinstelling_querylocatie_queryafdeling_querypatient_id_referenceCollection_date_referenceinstelling_referencelocatie_referenceafdeling_referenceCdate_queryCdate_referenceepi_link_idsnp
0ASM1421713v1_genomicASM1527755v1_genomic0,0003123880,0525485870,938905646pt417-aug-2020AP0000pt57-nov-2020HK000017-aug-20207-nov-2020Unrelated70
1ASM1421713v1_genomicASM1930313v1_genomic0,0025143030,151786980,788494326pt417-aug-2020AP0000pt621-jul-2021LA000017-aug-202021-jul-2021Unrelated3608
2ASM1421713v1_genomicASM194037v1_genomic0,0001029970,0806298850,916627997pt417-aug-2020AP0000pt29-jan-2017CP000017-aug-20209-jan-2017Unrelated103
3ASM1421713v1_genomicASM2008964v1_genomic0,0042784810,1240208750,773557592pt417-aug-2020AP0000pt721-sep-2021NO000017-aug-202021-sep-2021Unrelated7313
4ASM1421713v1_genomicASM2491733v1_genomic0,0004982950,085970580,900912922pt417-aug-2020AP0000pt84-sep-2022TX000017-aug-20204-sep-2022Unrelated145
5ASM1421713v1_genomicASM2539267v1_genomic0,0001569390,100404380,895510335pt417-aug-2020AP0000pt923-sep-2022RA000017-aug-202023-sep-2022Unrelated83
6ASM1421713v1_genomicASM972006v1_genomic0,0005233880,086776140,899463797pt417-aug-2020AP0000pt327-nov-2017US000017-aug-202027-nov-2017Unrelated96

输入与预期

  • 输入的query ID列表 = [ASM1527755v1_genomic, ASM1930313v1_genomic, ASM194037v1_genomic, ASM2008964v1_genomic]
  • 预期输出:与主DataFrame结构一致的表格,但仅包含输入列表中一个元素在query列、另一个元素在reference列的记录。

问题原因与验证方案

核心原因

你的函数逻辑是筛选主DataFrame中query和reference同时属于目标列表的记录,但忽略了一个关键前提:主DataFrame本身可能不包含所有预期的成对组合。

比如示例数据中,目标列表里的ASM1527755v1_genomic只出现在reference列,从未作为query出现过,因此以它为query、其他目标元素为reference的记录根本不存在于主DataFrame中,自然无法被筛选出来。

验证步骤

  1. 检查目标列表中的元素是否都在主DataFrame的query列出现过:
target_list = df_selection_ur["query"].unique().tolist()
missing_in_query = [x for x in target_list if x not in df_metadata["query"].unique()]
print("在query列缺失的元素:", missing_in_query)
  1. 统计主DataFrame中实际存在的目标元素成对组合数量,对比预期:
from itertools import combinations

# 生成所有预期的无序成对组合
expected_pairs = set(combinations(target_list, 2))
# 提取主DataFrame中符合条件的无序成对组合
existing_pairs = set(df_metadata[
    df_metadata["query"].isin(target_list) & df_metadata["reference"].isin(target_list)
].apply(lambda row: tuple(sorted((row["query"], row["reference"]))), axis=1))
# 找出缺失的组合
missing_pairs = expected_pairs - existing_pairs
print("缺失的成对组合数量:", len(missing_pairs))
print("缺失的组合:", missing_pairs)

解决方案

根据验证结果,有两种处理方式:

  1. 补充数据:如果主DataFrame确实缺少部分成对记录,需要补充这些缺失的query-reference组合数据,才能得到完整的171组结果。
  2. 调整筛选逻辑:如果允许接受(A,B)和(B,A)两种顺序的记录(只要两个元素都在目标列表中即可),可以保留原逻辑,或者改用更清晰的写法:
def metadata_def_epi(df_metadata, df_selection_ur):
    target_list = df_selection_ur["query"].unique().tolist()
    # 筛选query和reference都属于目标列表的所有记录
    mask = df_metadata["query"].isin(target_list) & df_metadata["reference"].isin(target_list)
    df_out = df_metadata[mask]
    return df_out

内容的提问来源于stack exchange,提问作者Freek de Kreek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:45:25