7

まず、これが少し長くなってしまったら申し訳ありませんが、私が問題を抱えていることと、私がすでに試したことを完全に説明したかったのです.

複数の条件で 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)

これを行うためのより効果的な方法を提案できる人はいますか?

4

2 に答える 2

2

これを解決する方法を考えました-2つの方法を組み合わせることで:

まず、個々の染色体に注目してから、これらの小さなデータフレーム内の遺伝子をループします。これも、SQL クエリを使用する必要はありません。また、範囲内にある SNP を持たない重複遺伝子をすぐに特定するためのセクションも含めました。これは、通常は回避しようとする二重の for ループを使用しますが、この場合は非常にうまく機能します。

all_dfs = []

for chromosome in snp_df['chromosome'].unique():
    this_chr_snp    = snp_df.loc[snp_df['chromosome'] == chromosome]
    this_genes      = gene_df.loc[gene_df['chromosome'] == chromosome]

    # Getting rid of redundant genes
    min_bp      = this_chr_snp['BP'].min()
    max_bp      = this_chr_snp['BP'].max()
    this_genes  = this_genes.loc[~(this_genes['chr_start'] >= max_bp) &
            ~(this_genes['chr_stop'] <= min_bp)]

    for line in this_genes.iterrows():
        info     = line[1]
        this_snp = this_chr_snp.loc[(this_chr_snp['BP'] >= info['chr_start']) &
                (this_chr_snp['BP'] <= info['chr_stop'])]
        if this_snp.shape[0] != 0:
            this_snp    = this_snp[['SNP']]
            this_snp.insert(1, 'feature_id', info['feature_id'])
            all_dfs.append(this_snp)

all_genic_snps  = pd.concat(all_dfs)

これは驚くほど速く実行されるわけではありませんが、実行されるため、実際にいくつかの回答を得ることができます。ただし、より効率的に実行するためのヒントが誰かにあるかどうかを知りたいです。

于 2015-07-15T00:14:30.690 に答える
1

以下を使用して、探しているものを達成できます。

merged_df=snp_df.merge(gene_df,on=['chromosome'],how='inner')
merged_df=merged_df[(merged_df.BP>=merged_df.chr_start) & (merged_df.BP<=merged_df.chr_stop)][['SNP','feature_id']]

注: サンプル データフレームは結合基準を満たしていません。変更されたデータフレームを使用した例を次に示します。

snp_df
Out[193]: 
   chromosome        SNP      BP
0           1  rs3094315  752566
1           1  rs3131972   30400
2           1  rs2073814  753474
3           1  rs3115859  754503
4           1  rs3131956  758144

gene_df
Out[194]: 
   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

merged_df
Out[195]: 
         SNP        feature_id
8  rs3131972  GeneID:100302278
于 2015-07-14T15:39:59.197 に答える