我有两个数据帧:
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
我希望通过col1
上的匹配来更新col2
中col3
,df1
,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
如何使用此列名称来获得所需的结果?
我提到了this question和this question,它指示我使用add = ['col1', 'col2', 'col3']
,但我无法弄清楚如何合并索引的引用和多列的列表a la :
.loc
显然这不起作用......
答案 0 :(得分:2)
这是combine_first
-
i = df1.set_index('id')
j = df2.drop(['A', 'B'], 1).set_index('id') # df2.set_index('id')[add]
df = i.combine_first(j).reset_index()
df
id A B col1 col2 col3
0 0 E1 E2 NaN NaN NaN
1 1 E1 E3 NaN NaN NaN
2 2 E1 E4 NaN NaN NaN
3 3 E2 E1 1.0 0.0 1.0
4 4 E1 E4 NaN NaN NaN
5 5 E2 E1 0.0 1.0 1.0
如果列的顺序很重要,reindex
-
df = i.combine_first(j).reset_index().reindex(columns=df1.columns)
df
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
答案 1 :(得分:2)
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
答案 2 :(得分:2)
我们可以使用concat
和drop duplicates
即
df3 = pd.concat([df,df2]).drop_duplicates(['id'],keep='last').reset_index(drop=True)
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 E1 E4 4 NaN NaN NaN
4 E1 E2 3 1.0 0.0 1.0
5 E1 E3 5 0.0 1.0 1.0