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

我想合并两个数据框,df2 可能有更多列,并且总是 1 行。我希望 df2 行中的数据覆盖 df 中的匹配行。注意:serno列一起使一行唯一。

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

我试过向左合并,但这会创建两个 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''c_y'所以我只切片我想要的共同列然后合并

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

      set_axis(df.index)
    
  3. 最后,由于生成的数据帧与indexcolumns相同df。我可以用以下方法填充缺失的位:

    fillna(df)
    

以上是熊猫左合并将数据保留在重复列的右数据框中的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>