我有两个数据框:
d1 = {'id_': ['a','b','c','d'],
'year':['2018','2019','2017','2019']}
d2 = {'id_': ['a','c','e'],
'year':['2015',NaN,'2012']}
test1 = pd.DataFrame(d1)
test2 = pd.DataFrame(d2)
id_ year
0 a 2018
1 b 2019
2 c 2017
3 d 2019
id_ year
0 a 2015
1 c None
2 e 2012
仅当year
匹配时,我才需要用test1
中的year
个值替换test2
中的id_
个值。如果值为NaN,我想保留旧值。
So the result looks like:
id_ year
0 a 2015
1 b 2019
2 c 2017
3 d 2019
我遇到的所有答案都基于索引或使用字典将旧值映射到新值。 感谢您的帮助。
答案 0 :(得分:4)
使用update
test1=test1.set_index('id_')
test1.update(test2.set_index('id_'))
test1.reset_index(inplace=True)
test1
Out[582]:
id_ year
0 a 2015
1 b 2019
2 c 2017
3 d 2019
答案 1 :(得分:4)
在这里使用concat
和drop_duplicates
。
test3 = test2[test2['id_'].isin(test1['id_'])].dropna()
pd.concat([test1, test3]).drop_duplicates('id_', keep='last')
id_ year
1 b 2019
2 c 2017
3 d 2019
0 a 2015
这是基于merge
的替代方案。
test3 = test1.merge(test2, on='id_', how='left')
test3['year'] = test3.pop('year_y').fillna(test3.pop('year_x'))
test3
id_ year
0 a 2015
1 b 2019
2 c 2017
3 d 2019