Python 数据帧合并而不复制任何一方?
我经常从“QC”的不同来源获得包含类似信息的表格。有时我想把这两个表并排放在一起,输出到excel以显示其他表,这样我们就可以解决差异。要做到这一点,我需要一个“懒惰”的数据帧合并 我有两张桌子:Python 数据帧合并而不复制任何一方?,python,pandas,dataframe,merge,duplicates,Python,Pandas,Dataframe,Merge,Duplicates,我经常从“QC”的不同来源获得包含类似信息的表格。有时我想把这两个表并排放在一起,输出到excel以显示其他表,这样我们就可以解决差异。要做到这一点,我需要一个“懒惰”的数据帧合并 我有两张桌子: 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
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()得到的结果:
我觉得一定有一个简单的方法可以做到这一点,但我所有的解决方案都很复杂
merge或concat中是否有类似“no_copy”的参数 看起来您不能单独使用给定的信息,您需要引入一个累积计数列来添加到合并列中。考虑这个解决方案
>>> 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
类型
添加累积计数本质上强制实例在两侧相互匹配,给定级别的第一个匹配匹配相应的第一个级别,同样地,对于所有级别的级别的所有实例,使用cum count非常聪明。。比我强制索引在两个df之间匹配的解决方案更干净。
>>> 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
>>>