合并'左',但尽可能覆盖'右'值[英] Merge 'left', but override 'right' values where possible

本文是小编为大家收集整理的关于合并'左',但尽可能覆盖'右'值的处理方法,想解了合并'左',但尽可能覆盖'右'值的问题怎么解决?合并'左',但尽可能覆盖'右'值问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

目标

我已经查看了 pandas 关于合并的文档 但对在"左"合并中有效地覆盖值有疑问.我可以简单地为一对值执行此操作(如 here),但是在尝试进行多对时会变得混乱.

设置

如果我采用以下数据框:

a = pd.DataFrame({
   'id': [0,1,2,3,4,5,6,7,8,9],
    'val': [100,100,100,100,100,100,100,100,100,100]
})

b = pd.DataFrame({
    'id':[0,2,7],
    'val': [500, 500, 500]
})

我可以合并它们:

df = a.merge(b, on=['id'], how='left', suffixes=('','_y'))

得到

   id  val  val_y
0   0  100  500.0
1   1  100    NaN
2   2  100  500.0
3   3  100    NaN
4   4  100    NaN
5   5  100    NaN
6   6  100    NaN
7   7  100  500.0
8   8  100    NaN
9   9  100    NaN

我想在不存在右值的地方保留左值,但在可能的情况下用右值覆盖.

我的想要的结果是:

   id    val
0   0  500.0
1   1  100.0
2   2  500.0
3   3  100.0
4   4  100.0
5   5  100.0
6   6  100.0
7   7  500.0
8   8  100.0
9   9  100.0

我的尝试

我知道我可以用几行代码来完成这个:

df.loc[df.val_y.notnull(), 'val'] = df[df.val_y.notnull()].val_y
df = df.drop(['val_y'], axis = 1)

或者我可以使用 这个问题的逻辑.

但是,当我想要应用此逻辑的多个列配对时,这会变得混乱.

例如,使用下面的a和b:

a = pd.DataFrame({
   'id': [0,1,2,3,4,5,6,7,8,9],
    'val': [100,100,100,100,100,100,100,100,100,100],
    'val_2':[200, 200, 200, 200, 200, 200, 200, 200, 200, 200]
})
b = pd.DataFrame({
    'id':[0,2,7],
    'val': [500, 500, 500],
    'val_2': [500,500,500]
})

有没有更快、更简洁的方法来获得我想要的结果?

推荐答案

我会使用 set_index 和 update:

u = a.set_index('id')
u.update(b.set_index('id'))  # Update a's values with b's values

u.reset_index()

   id    val
0   0  500.0
1   1  100.0
2   2  500.0
3   3  100.0
4   4  100.0
5   5  100.0
6   6  100.0
7   7  500.0
8   8  100.0
9   9  100.0

更新在索引上对齐.因此,在执行更新步骤之前,我将"id"设置为两个 DataFrame 中的索引.

请注意,"id"列必须是唯一的.

<小时>

另一种选择是使用 concat 和 drop_duplicates:

pd.concat([b, a]).drop_duplicates('id').sort_values('id')

   id  val
0   0  500
1   1  100
1   2  500
3   3  100
4   4  100
5   5  100
6   6  100
2   7  500
8   8  100
9   9  100

由于 b 覆盖 a,因此 b 必须在 concat 步骤中排在第一位.

本文地址:https://www.itbaoku.cn/post/1728005.html

相关标签/搜索