我有两个数据框:
df1
A B id col1 col2 col3
0 E1 E2 0 NaN NaN NaN
1 E1 E3 1 NaN NaN NaN
2 E1 E4 2 NaN NaN NaN
3 E2 E1 3 NaN NaN NaN
4 E1 E4 4 NaN NaN NaN
5 E2 E1 5 NaN NaN NaN
df2
A B id col1 col2 col3
0 E1 E2 3 1 0 1
1 E1 E3 5 0 1 1
我想更新 df1 中的 col1、col2、col3 中的值df2通过匹配id得到:
df3
A B id col1 col2 col3
0 E1 E2 0 NaN NaN NaN
1 E1 E3 1 NaN NaN NaN
2 E1 E4 2 NaN NaN NaN
3 E2 E1 3 1 0 1
4 E1 E4 4 NaN NaN NaN
5 E2 E1 5 0 1 1
由于我的实际数据框要大得多,所以我想使用要更新的列名列表:
add = ['col1', 'col2', 'col3']
如何使用此列名来获得所需的结果?
我提到了 this question和 this question这指示我使用 .loc 但我无法弄清楚如何合并对索引的引用和多列列表:
df1.loc[df1['edge_id'] == df2['edge_id'], add] = df2[add]
显然这没有用...
请您参考如下方法:
使用combine_first :
df1[add] = df1.set_index('id')[add].combine_first(df2.set_index('id')[add]).values
print (df1)
A B id col1 col2 col3
0 E1 E2 0 NaN NaN NaN
1 E1 E3 1 NaN NaN NaN
2 E1 E4 2 NaN NaN NaN
3 E2 E1 3 1.0 0.0 1.0
4 E1 E4 4 NaN NaN NaN
5 E2 E1 5 0.0 1.0 1.0
