我经常从“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中的参数?
答案 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
类型。
添加累积计数实质上会强制实例在两端相互匹配,给定级别的第一个匹配项与相应的第一个级别匹配,同样适用于所有级别的所有级别实例。