2017-06-15 9 views
2

私は以下のデータフレームを持っています。Pandasを使用して別のデータフレームの情報からデータフレームをフィルタリングする

df = pd.DataFrame(columns=['Chromosome', 'Start','End'], 
    data=[ 
      ['chr1', 2000, 3000], 
      ['chr1', 500, 1500], 
      ['chr3', 3000, 4000], 
      ['chr5', 4000, 5000], 
      ['chr17', 9000, 10000], 
      ['chr19', 1500, 2500] 
      ]) 

以下のようなプローブデータフレームがあります。

probes = pd.DataFrame(columns=['Probe', 'Chrom','Position'], 
    data=[ 
      ['CG999', 'chr1', 2500], 
      ['CG000', 'chr19, 2000], 
      ]) 

私は、プローブの染色体が含まれており、それは開始と終了番号は、その後、DFに新しい列/フィールドにプローブ名を追加します間のプローブの位置を持っている行のDFをフィルタリングします。

Probe Chrom Start End 
0 CG999 chr1  2000  3000 
5 CG000 chr19 1500  2500 

作品下の私の試みが、プローブ列にプローブ名を配置し、プローブデータをループに依存しているしません:所望の出力は以下の通りです。これを行うためのより効率的な方法が必要です。

all_indexes = [] 

# fake2.tsv is the aforementioned probes dataframe 
with open('fake2.tsv') as f: 
    for x in f: 
     probe, chrom, pos = x.rstrip("\n").split("\t") 
     row = df[(df['Chromosome'] == chrom) & ((int(pos) > df['Start']) & (int(pos) < df['End']))] 
     all_indexes.append(t.index.tolist()) 

all_t = [y for x in all_t for y in x] 
df.iloc[all_indexes] 

答えて

3

あなたはこれを試すことができます。

df.merge(probes, left_on='Chromosome', right_on='Chrom').query('Start < Position < End') 

出力:

Chromosome Start End Probe Chrom Position 
0  chr1 2000 3000 CG999 chr1  2500 
2  chr19 1500 2500 CG000 chr19  2000 
関連する問題