首先,对不起,如果这有点长,但我想完整地描述我遇到的问题以及我已经尝试过的问题.
我试图在多个条件下将两个数据帧对象连接(合并)在一起.如果要满足的条件都是"等于"运算符,我知道如何做到这一点,但是,我需要使用的不仅仅是更多.
数据框代表遗传信息:一个是基因组中的突变列表(称为SNP),另一个是基因在人类基因组上的位置信息.对它们执行df.head()会返回以下内容:
chromosome SNP BP
0 1 rs3094315 752566
1 1 rs3131972 752721
2 1 rs2073814 753474
3 1 rs3115859 754503
4 1 rs3131956 758144
Run Code Online (Sandbox Code Playgroud)
这显示了SNP参考ID及其位置.'BP'代表'Base-Pair'位置.
chromosome chr_start chr_stop feature_id
0 1 10954 11507 GeneID:100506145
1 1 12190 13639 GeneID:100652771
2 1 14362 29370 GeneID:653635
3 1 30366 30503 GeneID:100302278
4 1 34611 36081 GeneID:645520
Run Code Online (Sandbox Code Playgroud)
该数据框显示了所有感兴趣的基因的位置.
我想知道的是所有属于基因组中基因区域的SNP,并丢弃那些在这些区域之外的SNP.
如果我想基于多个(等于)条件将两个数据帧合并在一起,我会做类似以下的事情:
merged_df = pd.merge(snp_df, gene_df, on=['chromosome', 'other_columns'])
Run Code Online (Sandbox Code Playgroud)
然而,在这种情况下 - 我需要找到染色体值与Gene数据帧中的那些匹配的SNP,并且BP值落在'chr_start'和'chr_stop'之间.这种挑战的原因是这些数据帧非常大.在此当前数据集中,snp_df具有6795021行,并且gene_df具有34362.
我试图通过分别观察染色体或基因来解决这个问题.由于未使用性染色体,因此有22种不同的染色体值(第1-22位).这两种方法都耗费了很长时间.一个使用该pandasql模块,而另一个方法是循环通过单独的基因.
import pandas as pd …Run Code Online (Sandbox Code Playgroud)