Pandas Dataframe合并没有重复任何一方?

时间:2017-10-26 21:33:35

标签: python pandas dataframe merge duplicates

我经常从“QC”获取包含来自不同来源的类似信息的表格。有时候我想把这两个表放在一起,输出到excel来显示其他表,这样我们就可以解决差异了。为此,我希望与pandas dataframe进行“懒惰”合并。

说,我有两张桌子:

df a:                   df b:
    n   I   II              n   III IV
0   a   1   2           0   a   1   2
1   a   3   4           1   a   0   0
2   b   5   6           2   b   5   6
3   c   9   9           3   b   7   8

我希望得到如下结果:

a merge b

    n   I   II  III IV
0   a   1   2   1   2
1   a   3   4       
2   b   5   6   5   6
3   b           7   8
4   c   9   9   

当然这是我用merge()得到的:

a.merge(b, how='outer', on="n")

    n   I   II  III IV
0   a   1   2   1.0 2.0
1   a   1   2   0.0 0.0
2   a   3   4   1.0 2.0
3   a   3   4   0.0 0.0
4   b   5   6   5.0 6.0
5   b   5   6   7.0 8.0
6   c   9   9   NaN NaN

我觉得必须有一个简单的方法来做到这一点,但我所有的解决方案都令人费解。

在“no_copy”之类的内容中是否有合并或concat中的参数?

1 个答案:

答案 0 :(得分:1)

看起来您无法单独提供信息,您需要引入累积计数列以添加到合并列。考虑这个解决方案

>>> import pandas
>>> dfa = pandas.DataFrame( {'n':['a','a','b','c'] , 'I'   : [1,3,5,9] , 'II':[2,4,6,9]}, columns=['n','I','II'])
>>> dfb = pandas.DataFrame( {'n':['a','b','b']     , 'III' : [1,5,7]   , 'IV':[2,6,8]  }, columns=['n','III','IV'])
>>>
>>> dfa['nCC'] = dfa.groupby( 'n' ).cumcount()
>>> dfb['nCC'] = dfb.groupby( 'n' ).cumcount()
>>> dm = dfa.merge(dfb, how='outer', on=['n','nCC'] )
>>>
>>>
>>> dfa
   n  I  II  nCC
0  a  1   2    0
1  a  3   4    1
2  b  5   6    0
3  c  9   9    0
>>> dfb
   n  III  IV  nCC
0  a    1   2    0
1  b    5   6    0
2  b    7   8    1
>>> dm
   n    I   II  nCC  III   IV
0  a  1.0  2.0    0  1.0  2.0
1  a  3.0  4.0    1  NaN  NaN
2  b  5.0  6.0    0  5.0  6.0
3  c  9.0  9.0    0  NaN  NaN
4  b  NaN  NaN    1  7.0  8.0
>>>

虽然索引与您的输出完全相同,但它在您想要的位置有缺口或缺少重复。由于涉及NaN,因此各个列都会被强制转换为float64类型。

添加累积计数实质上会强制实例在两端相互匹配,给定级别的第一个匹配项与相应的第一个级别匹配,同样适用于所有级别的所有级别实例。