Python 使用Pandas将DFs列表与交替列输出合并

Python 使用Pandas将DFs列表与交替列输出合并,python,pandas,Python,Pandas,我有以下代码: import pandas as pd rep1 = pd.DataFrame.from_items([('Probe', ['x', 'y', 'z']), ('Gene', ['foo', 'bar', 'qux']), ('RP1',[1.00,23.22,11.12]),('RP1',["A","B","C"]) ], orient='columns') rep2 = pd.DataFrame.from_items([('Probe', ['x', 'y', 'z'

我有以下代码:

import pandas as pd

rep1 = pd.DataFrame.from_items([('Probe', ['x', 'y', 'z']), ('Gene', ['foo', 'bar', 'qux']), ('RP1',[1.00,23.22,11.12]),('RP1',["A","B","C"])   ], orient='columns')
rep2 = pd.DataFrame.from_items([('Probe', ['x', 'y', 'z']), ('Gene', ['foo', 'bar', 'qux']), ('RP2',[3.33,77.22,18.12]),('RP2',["G","I","K"])   ], orient='columns')
rep3 = pd.DataFrame.from_items([('Probe', ['x', 'y', 'k']), ('Gene', ['foo', 'bar', 'kux']), ('RP3',[99.99,98.29,8.10]),('RP2',["M","P","J"]) ], orient='columns')

tmp = []
tmp.append(rep1)
tmp.append(rep2)
tmp.append(rep3)
这将生成以下数据帧列表

In [56]: tmp
Out[56]:
 [  Probe Gene    RP1 RP1
 0     x  foo   1.00   A
 1     y  bar  23.22   B
 2     z  qux  11.12   C,   Probe Gene    RP2 RP2
 0     x  foo   3.33   G
 1     y  bar  77.22   I
 2     z  qux  18.12   K,   Probe Gene    RP3 RP2
 0     x  foo  99.99   M
 1     y  bar  98.29   P
 2     k  kux   8.10   J]
上述每个数据帧具有以下特征:

  • 始终包含4列
  • 第二列和最后一列的名称相同
  • 前两列始终命名为
    Probe
    Gene
  • 探针
    基因
    的内容始终保持一致,即。 “x”总是和“foo”连用
  • 我正在尝试将这些DFs合并到列表中,以便它生成以下内容:

      Probe Gene    RP1     RP2  RP3    RP1  RP2  RP3
    0     x  foo   1.00    3.33  99.99    A    G   M
    1     y  bar  23.22   77.22  98.29    B    I   P
    2     z  qux  11.12   18.12   NA      C    K   NA
    3     k  kux     NA      NA  8.10     NA   NA  J
    
    我尝试了此代码,但失败:

    In [67]: reduce(pd.merge,tmp)
    MergeError: Left data columns not unique: Index([u'Probe', u'Gene', u'RP1', u'RP1'], dtype='object')
    

    正确的方法是什么?

    您可以重复删除列名。这里有一种简单的方法:

    In [11]: list(rep1.columns[0:2]) + [rep1.columns[2] + "_value"] + [rep1.columns[2] + "_letter"]
    Out[11]: ['Probe', 'Gene', 'RP1_value', 'RP1_letter']
    
    In [12]: for rep in tmp:
       .....:     rep.columns = list(rep.columns[0:2]) + [rep.columns[2] + "_value"] + [rep.columns[2] + "_letter"]
    
    In [13]: reduce(pd.merge,tmp)
    Out[13]:
      Probe Gene  RP1_value RP1_letter  RP2_value RP2_letter  RP3_value RP3_letter
    0     x  foo       1.00          A       3.33          G      99.99          M
    1     y  bar      23.22          B      77.22          I      98.29          P
    

    您还需要将其指定为外部合并(以获取NaN行):


    您可能应该参考此问题/答案。我确实想知道是否有一种方法可以
    mangle\u dupe\u cols
    (这是一个
    read\u csv
    选项)…如何将
    \u letter
    列部分分组到DFs的左侧?这对我来说很重要。@pdubois默认情况下,它们是按字母顺序排列的,因此您可以改为在它们前面加前缀,或者您可以
    .reindex\u axis([…您想要的列的顺序].axis=1)
    In [21]: reduce(lambda x, y: pd.merge(x, y, how='outer'),tmp)
    Out[21]:
      Probe Gene  RP1_value RP1_letter  RP2_value RP2_letter  RP3_value RP3_letter
    0     x  foo       1.00          A       3.33          G      99.99          M
    1     y  bar      23.22          B      77.22          I      98.29          P
    2     z  qux      11.12          C      18.12          K        NaN        NaN
    3     k  kux        NaN        NaN        NaN        NaN       8.10          J