Pandas 左合并将数据保留在重复列的右数据框中

2023-12-07

我想合并两个数据框,df2 可能有更多列,并且始终为 1 行。我希望 df2 行中的数据覆盖 df 中的匹配行。笔记:ser and no列组合在一起使行独一无二。

import pandas as pd

df = pd.DataFrame({'ser': {0: 0, 1: 0, 2: 0, 3: 1, 4: 1, 5: 1, 6: 2, 7: 2, 8: 2}, 'no': {0: 0, 1: 1, 2: 2, 3: 0, 4: 1, 5: 2, 6: 0, 7: 1, 8: 2}, 'c': {0: 1, 1: 1, 2: 1, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1}})

df2 = pd.DataFrame({'ser': {0: 1}, 'no': {0: 2}, 'c': {0: 88}, 'd': {0: 90}})


>>> df
   ser  no  c
0    0   0  1
1    0   1  1
2    0   2  1
3    1   0  1
4    1   1  1
5    1   2  1
6    2   0  1
7    2   1  1
8    2   2  1

>>> df2
   ser  no   c   d
0    1   2  88  90

我尝试过 merge left 但这会创建两个 c 列(c_x 和 c_y):

>>> pd.merge(df,df2,how='left',on=['ser','no'])
   ser  no  c_x   c_y     d
0    0   0    1   NaN   NaN
1    0   1    1   NaN   NaN
2    0   2    1   NaN   NaN
3    1   0    1   NaN   NaN
4    1   1    1   NaN   NaN
5    1   2    1  88.0  90.0
6    2   0    1   NaN   NaN
7    2   1    1   NaN   NaN
8    2   2    1   NaN   NaN

期望的输出:

   ser  no    c   d  
0    0   0    1   NaN 
1    0   1    1   NaN  
2    0   2    1   NaN 
3    1   0    1   NaN 
4    1   1    1   NaN 
5    1   2    88  90 
6    2   0    1   NaN
7    2   1    1   NaN
8    2   2    1   NaN

弗兰肯斯坦答案

df[['ser', 'no']].merge(df2, 'left').set_axis(df.index).fillna(df)

   ser  no     c     d
0    0   0   1.0   NaN
1    0   1   1.0   NaN
2    0   2   1.0   NaN
3    1   0   1.0   NaN
4    1   1   1.0   NaN
5    1   2  88.0  90.0
6    2   0   1.0   NaN
7    2   1   1.0   NaN
8    2   2   1.0   NaN

解释

  1. 我要合并列['ser', 'no']并且不想在中指定merge称呼。另外,我不想要愚蠢的重复列名,例如'c_x' and 'c_y'所以我只对我想要的共同列进行切片,然后合并

     df[['ser', 'no']].merge(df2, 'left')
    
  2. 当我合并时,我只想要左侧数据框中的行。然而,merge通常会产生许多与原始数据帧截然不同的行,因此会产生一个新的index。然而,NOTE这是假设正确的数据框(df2) has 无重复尊重地['ser', 'no'] then a 'left' merge应该产生与左侧数据帧相同的行数(df)。但它不会有相同的index一定。事实证明,在这个例子中确实如此。但我不想冒险。所以我用set_axis

      set_axis(df.index)
    
  3. 最后,由于生成的数据帧具有相同的index and columns as df。我可以用以下内容来填补缺失的部分:

    fillna(df)
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas 左合并将数据保留在重复列的右数据框中 的相关文章

随机推荐