如何在集合列

时间:2017-11-07 15:38:30

标签: python pandas dataframe

我在两个数据框中有代表生物系统中相互作用伙伴的列,因此,如果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'])

我希望进入' r1'排队' f1'和' r2'排队' f3'。

2 个答案:

答案 0 :(得分:1)

最后非常简单:我使用了freezeset,而不是设置。

答案 1 :(得分: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