gpt4 book ai didi

python - 合并 'left' ,但尽可能覆盖 'right' 值

转载 作者:太空狗 更新时间:2023-10-30 00:37:40 35 4
gpt4 key购买 nike

目标

我已经查看了 pandas documentation on merge但对在“左”合并中有效地覆盖值有疑问。我可以简单地为一对值执行此操作(如 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)

或者我可以使用 logic from this question .

但是当我想在其中应用此逻辑的多个列对时,这会变得困惑。

例如,使用下面的ab:

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_indexupdate 来做到这一点:

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”列必须是唯一的。


另一种选择是使用 concatdrop_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 步骤中排在第一位。

关于python - 合并 'left' ,但尽可能覆盖 'right' 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55977037/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com