匹配2个数据集之间的列中的值,更新多个列

时间:2017-12-15 11:32:44

标签: python pandas dataframe

我有两个数据帧:

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上的匹配来更新col2col3df1df2中的值得到:

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 questionthis question,它指示我使用add = ['col1', 'col2', 'col3'] ,但我无法弄清楚如何合并索引的引用和多列的列表a la :

.loc

显然这不起作用......

3 个答案:

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

使用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

答案 2 :(得分:2)

我们可以使用concatdrop 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