大熊猫:基于两列,用另一个数据框的值替换一个数据框的值

时间:2019-06-21 16:12:56

标签: python python-3.x pandas

我有两个数据框:

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

我遇到的所有答案都基于索引或使用字典将旧值映射到新值。 感谢您的帮助。

2 个答案:

答案 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)

在这里使用concatdrop_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