【发布时间】:2019-09-22 10:14:57
【问题描述】:
目标
我已经查看了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。
但是当我想要应用此逻辑的多个列配对时,这会变得混乱。
例如,使用下面的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]
})
有没有更快、更简洁的方法来获得我想要的结果?
【问题讨论】:
-
不是重复的——这与我的尝试类似,但需要应用于每对
val列