Python使用另一个表的值更新表的值

时间:2018-09-17 07:39:46

标签: python pandas

我使用python和pandas。

我想做个[df_result]。 df1和df2的a,b是条件。 如果a,b等于值,则将df1的“ d”列值更改为df2的“ d”列值。

如何制作? 我不知道有什么解决办法。

df1

a b c d

1 2 5 1

1 5 5 1

2 3 4 1

df2

a b d

1 2 2

1 2 2

2 3 4

df_result

a b c d

1 2 5 2

1 5 5 1

2 3 4 4

1 个答案:

答案 0 :(得分:1)

我认为如果两个DataFrame中的长度和索引值相同,并且将两个列都与numpy.where进行比较,则需要DataFrame.all

df1['d'] = np.where((df1[['a', 'b']] == df2[['a', 'b']]).all(axis=1), df2['d'], df1['d'])
print (df1)
   a  b  c  d
0  1  2  5  2
1  1  5  5  1
2  2  3  4  4

print (df1[['a', 'b']] == df2[['a', 'b']])
      a      b
0  True   True
1  True  False
2  True   True

print ((df1[['a', 'b']] == df2[['a', 'b']]).all(axis=1))
0     True
1    False
2     True
dtype: bool

另一种更通用的解决方案,用于通过merge和左联接进行匹配,但是在df2中的a列和b中的drop_duplicates列中必须是唯一的行,最后combine_first并删除不必要的列d_

df = (df1.merge(df2.drop_duplicates(['a','b']), on=['a','b'], how='left', suffixes=('_',''))
         .assign(d= lambda x: x['d'].combine_first(x['d_']))
         .drop('d_', axis=1))

print (df)
   a  b  c    d
0  1  2  5  2.0
1  1  5  5  1.0
2  2  3  4  4.0

print (df2.drop_duplicates(['a','b']))
   a  b  d
0  1  2  2
2  2  3  4

print (df1.merge(df2.drop_duplicates(['a','b']), on=['a','b'], how='left', suffixes=('_','')))
   a  b  c  d_    d
0  1  2  5   1  2.0
1  1  5  5   1  NaN
2  2  3  4   1  4.0