Python 数据帧合并而不复制任何一方?

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

我经常从“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   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
>>>