2017-11-07 14 views
0

生物システム内の相互作用するパートナーを表す2つのデータフレームの列があるため、gene_Aがgene_Bと相互作用する場合、 'gene_pair'列のエントリは{gene_A、gene_B}になります。私は、内側をしたい参加、しかししよう:私は私がマージすることはできません言うことができるようにセットの列に2つのパンダデータフレームをマージする方法

pd.merge(df1, df2, how='inner', on=['gene_pair']) 

がそう限り、

TypeError: type object argument after * must be a sequence, not itertools.imap 

が、私は順不同ペアにマージする必要があり、エラーがスローされます遺伝子名を持つ2つの個別の列の組み合わせ。このマージを達成する別の方法がありますか?

いくつかの例のDFS:

gene_pairs1 = [ 
    set(['gene_A','gene_B']), 
    set(['gene_A','gene_C']), 
    set(['gene_D','gene_A']) 
] 
df1 = pd.DataFrame({'r_name': ['r1','r2','r3'], 'gene_pair': gene_pairs1}) 

gene_pairs2 = [ 
    set(['gene_A','gene_B']), 
    set(['gene_F','gene_A']), 
    set(['gene_C','gene_A']) 
] 
df2 = pd.DataFrame({'function': ['f1','f2','f3'], 'gene_pair': gene_pairs2}) 

pd.merge(df1,df2,how='inner',on=['gene_pair']) 

と、私は 'F3' でラインアップする 'F1' と 'R2' とまでエントリーR1 '' 行をしたいと思います。

+0

あなたはこれを示すサンプルDF1とDF2を提供することはできますか? –

答えて

1

最後にかなりシンプルです:私は、設定するよりも、frozensetを使用しました。

0

私は、各ペアに追加のID列を取得し、それに参加することをお勧めします!例えば、 。

df2['gp'] = df2.gene_pair.apply(lambda x: list(x)[0][-1]+list(x)[1][-1]) 
df1['gp'] = df1.gene_pair.apply(lambda x: list(x)[0][-1]+list(x)[1][-1]) 
pd.merge(df1, df2[['function','gp']],how='inner',on=['gp']).drop('gp', axis=1) 

enter image description here

関連する問題