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

如何用循环遍历索引替代手动指定索引计算基因DataFrame行间交集?

问题描述

我需要从基因列表中寻找共同基因,目前使用以下代码手动指定索引计算交集:

pathway=(list(set(genes.iloc[0]).intersection(genes.iloc[i+1]))),(list(set(genes.iloc[1]).intersection(genes.iloc[i+2]))),(list(set(genes.iloc[2]).intersection(genes.iloc[i+3]))),(list(set(genes.iloc[3]).intersection(genes.iloc[i+4])

由于我的genes DataFrame包含90列,手动指定索引过于繁琐,希望通过循环遍历索引简化操作。

具体需求:将第1行与第2-8行依次比较,第2行与第3-8行依次比较,以此类推,直到第7行与第8行比较。

我尝试了以下代码,但仅输出第1行与其他行的交集结果,无法实现后续行的比较:

for i in range(len(keys)):
    for k in range (0,8):
        for h in range (1,9):
            pathway1=(list(set(genes.iloc[k]).intersection(genes.iloc[i+h])))
            print(pathway1)
解决方案

你之前的嵌套循环逻辑冗余且索引范围控制错误,只需两层循环即可实现需求:

针对前8行的实现代码

# 处理前8行(索引0对应第1行,索引7对应第8行)
for base_row in range(7):  # 基准行:第1行到第7行(索引0到6)
    for compare_row in range(base_row + 1, 8):  # 对比行:基准行之后的行,直到第8行(索引7)
        common_genes = list(set(genes.iloc[base_row]).intersection(genes.iloc[compare_row]))
        # 打印结果,可根据需求改为存储到集合/字典中
        print(f"第{base_row+1}行与第{compare_row+1}行的共同基因:{common_genes}")

扩展到全部90行的实现

如果需要对90行执行相同逻辑(每行与后续所有行比较),只需调整循环范围:

for base_row in range(len(genes) - 1):
    for compare_row in range(base_row + 1, len(genes)):
        common_genes = list(set(genes.iloc[base_row]).intersection(genes.iloc[compare_row]))
        print(f"第{base_row+1}行与第{compare_row+1}行的共同基因:{common_genes}")

原代码失效原因

原代码的三层循环逻辑混乱:

  • 多余的i循环(len(keys)未明确含义)导致索引计算错误
  • h的范围1-9会导致i+h超出前8行的索引范围
  • 重复计算了大量不需要的行组合(比如第2行和第1行),最终只输出了部分结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:31:49