2017-11-07 2 views
0

생물학적 시스템에서 상호 작용하는 파트너를 나타내는 두 개의 데이터 프레임에 열이 있으므로 gene_A가 gene_B와 상호 작용하면 'gene_pair'열의 항목이 {gene_A, gene_B}가됩니다. 나는 내부를하고 싶어 가입하지만, 시도 : 나는에 병합 할 수 없습니다 말할 수두 세트의 팬더 데이터 프레임을 병합하는 방법

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

지금까지,

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

내가 정렬되지 않은 쌍에 병합하는 데 필요한 오류가 발생합니다 유전자 이름이있는 두 개의 개별 열의 조합. 이 병합을 수행하는 다른 방법이 있습니까?

몇 가지 예를 들어 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

관련 문제