まず、これが少し長くなってしまったら申し訳ありませんが、私が問題を抱えていることと、私がすでに試したことを完全に説明したかったのです.
複数の条件で 2 つのデータフレーム オブジェクトを結合 (マージ) しようとしています。満たされる条件がすべて「等しい」演算子である場合にこれを行う方法は知っていますが、LESS THAN と MORE THAN を使用する必要があります。
データフレームは遺伝情報を表します。1 つはゲノム内の突然変異 (SNP と呼ばれる) のリストであり、もう 1 つはヒトゲノム上の遺伝子の位置に関する情報を提供します。これらに対して df.head() を実行すると、以下が返されます。
SNP データフレーム (snp_df):
chromosome SNP BP
0 1 rs3094315 752566
1 1 rs3131972 752721
2 1 rs2073814 753474
3 1 rs3115859 754503
4 1 rs3131956 758144
これは、SNP 参照 ID とその場所を示しています。「BP」は「Base-Pair」位置を表します。
遺伝子データフレーム (gene_df):
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
このデータフレームは、対象のすべての遺伝子の位置を示しています。
私が知りたいのは、ゲノムの遺伝子領域内にあるすべての SNP であり、これらの領域の外にあるものは破棄します。
複数の (等しい) 条件に基づいて 2 つのデータフレームをマージしたい場合は、次のようにします。
merged_df = pd.merge(snp_df, gene_df, on=['chromosome', 'other_columns'])
ただし、この例では、染色体値が Gene データフレームの値と一致し、BP 値が「chr_start」と「chr_stop」の間にある SNP を見つける必要があります。これを困難にしているのは、これらのデータフレームが非常に大きいことです。この現在のデータセットでは、snp_df には 6795021 行があり、gene_df には 34362 行があります。
私は、染色体または遺伝子を別々に調べることによって、これに取り組もうとしました。性染色体は使用されないため、22 の異なる染色体値 (int 1 ~ 22) があります。どちらの方法も非常に時間がかかります。1 つはpandasql
モジュールを使用する方法で、もう 1 つは個別の遺伝子をループする方法です。
SQL メソッド
import pandas as pd
import pandasql as psql
pysqldf = lambda q: psql.sqldf(q, globals())
q = """
SELECT s.SNP, g.feature_id
FROM this_snp s INNER JOIN this_genes g
WHERE s.BP >= g.chr_start
AND s.BP <= g.chr_stop;
"""
all_dfs = []
for chromosome in snp_df['chromosome'].unique():
this_snp = snp_df.loc[snp_df['chromosome'] == chromosome]
this_genes = gene_df.loc[gene_df['chromosome'] == chromosome]
genic_snps = pysqldf(q)
all_dfs.append(genic_snps)
all_genic_snps = pd.concat(all_dfs)
遺伝子反復法
all_dfs = []
for line in gene_df.iterrows():
info = line[1] # Getting the Series object
this_snp = snp_df.loc[(snp_df['chromosome'] == info['chromosome']) &
(snp_df['BP'] >= info['chr_start']) & (snp_df['BP'] <= info['chr_stop'])]
if this_snp.shape[0] != 0:
this_snp = this_snp[['SNP']]
this_snp.insert(len(this_snp.columns), 'feature_id', info['feature_id'])
all_dfs.append(this_snp)
all_genic_snps = pd.concat(all_dfs)
これを行うためのより効果的な方法を提案できる人はいますか?