我正试图用基于第三列的另一列的值替换数据帧列中的值,并保留第一个df中的其余值。
# df1
country name value
romania john 100
russia emma 200
sua mark 300
china jack 400
# df2
name value
emma 2
mark 3
期望结果:
# df3
country name value
romania john 100
russia emma 2
sua mark 3
china jack 400
谢谢
一种方法如下:
- 在列
name
上使用Series.map
,并通过将df2
的索引设置为name
(df.set_index
(将其转换为一个系列进行映射 - 接下来,链
Series.fillna
以将NaN
值替换为来自df.value
的原始值(即,每当映射没有导致匹配时(,并分配给df['value']
df['value'] = df['name'].map(df2.set_index('name')['value']).fillna(df['value'])
print(df)
country name value
0 romania john 100.0
1 russia emma 2.0
2 sua mark 3.0
3 china jack 400.0
注意:结果现在将包含浮点值。如果您喜欢integers
,也可以链.astype(int)
。
另一个选项可能是使用panda。DataFrame.更新:
df1.set_index('name', inplace=True)
df1.update(df2.set_index('name'))
df1.reset_index(inplace=True)
name country value
0 john romania 100.0
1 emma russia 2.0
2 mark sua 3.0
3 jack china 400.0
另一个选项:
df3 = df1.merge(df2, on = 'name', how = 'left')
df3['value'] = df3.value_y.fillna(df3.value_x)
df3.drop(['value_x', 'value_y'], axis = 1, inplace = True)
# country name value
# 0 romania john 100.0
# 1 russia emma 2.0
# 2 sua mark 3.0
# 3 china jack 400.0
可再现数据:
df1=pd.DataFrame({'country':['romania','russia','sua','china'],'name':['john','emma','mark','jack'],'value':[100,200,300,400]})
df2=pd.DataFrame({'name':['emma','mark'],'value':[2,3]})