如何用循环遍历索引替代手动指定索引计算基因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
相关产品推荐
相关产品推荐

