我使用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
答案 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