如何在reduce over Pandas合并函数中传递关键字参数

时间:2015-02-10 04:14:08

标签: 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])], orient='columns')
rep2 = pd.DataFrame.from_items([('Probe', ['x', 'y', 'w']), ('Gene', ['foo', 'bar', 'wux']), ('RP2',[11.33,31.25,22.12])], orient='columns')
rep3 = pd.DataFrame.from_items([('Probe', ['x', 'y', 'z']), ('Gene', ['foo', 'bar', 'qux'])], orient='columns')

tmp = []
tmp.append(rep1)
tmp.append(rep2)
tmp.append(rep3)

使用此列表输出:

In [35]: tmp
Out[35]:
[  Probe Gene    RP1
 0     x  foo   1.00
 1     y  bar  23.22
 2     z  qux  11.12,   Probe Gene    RP2
 0     x  foo  11.33
 1     y  bar  31.25
 2     w  wux  22.12,   Probe Gene
 0     x  foo
 1     y  bar
 2     z  qux]

请注意以下事项:

  • 每个DF将包含3列,但最后一列可能具有不同的名称
  • rep3在第3栏中没有任何值,我们想自动将其丢弃
  • w wux仅存在于rep2中,我们希望将其包含在内,并为不包含该值的其他数据框赋值0。

我想要做的是执行外部合并,以便产生以下结果:

  Probe Gene      RP1        RP2
0     x  foo     1.00      11.33
1     y  bar    23.22      31.25
2     z  qux    11.12      22.12
3     w  wux    22.12      0    

我尝试了这个但是不起作用

In [25]: reduce(pd.merge,how="outer",tmp)
  File "<ipython-input-25-1b2a5f2dd378>", line 1
    reduce(pd.merge,how="outer",tmp)
SyntaxError: non-keyword arg after keyword arg

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

+1函数式编程风格。耶!

一种方法是使用functools.partial部分应用合并功能。

import functools
outer_merge = functools.partial(pd.merge, how="outer")
reduce(outer_merge, tmp)

首次尝试时,这会给出:

In [25]: reduce(outer_merge, tmp)
Out[25]: 
  Probe Gene    RP1    RP2
0     x  foo   1.00  11.33
1     y  bar  23.22  31.25
2     z  qux  11.12    NaN
3     w  wux    NaN  22.12

[4 rows x 4 columns]

它揭示了您对所需结果的一些不一致之处。您可以看到实际上有两个位置,外部合并必须提供缺失值,而不仅仅是一个。

作为最后一步,您可以使用fillna输入零值:

In [26]: reduce(outer_merge, tmp).fillna(0)
Out[26]: 
  Probe Gene    RP1    RP2
0     x  foo   1.00  11.33
1     y  bar  23.22  31.25
2     z  qux  11.12   0.00
3     w  wux   0.00  22.12

[4 rows x 4 columns]