【问题标题】:Pandas Dataframe merge without duplicating either side?熊猫数据框合并而不复制任何一方?
【发布时间】:2018-04-08 10:02:47
【问题描述】:

我经常从“QC”的不同来源获得包含类似信息的表格。有时我想将这两个表并排放置,输出到 excel 以显示其他人,这样我们就可以解决差异。为此,我想要与 pandas 数据框进行“惰性”合并。

比如说,我有两张桌子:

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

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

merge 或 concat 中是否有类似“no_copy”的参数?

【问题讨论】:

    标签: python pandas dataframe merge duplicates


    【解决方案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 类型。

    添加累积计数实质上会强制实例在两侧相互匹配,给定级别的第一个匹配项匹配相应的第一个级别,对于所有级别的级别的所有实例也是如此。

    【讨论】:

    • 非常聪明地使用暨计数。比我强制索引在两个 df 之间匹配的一种解决方案要干净得多。
    猜你喜欢
    • 2017-11-13
    • 2017-11-26
    • 2022-01-10
    • 2019-12-18
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    相关资源
    最近更新 更多