熊猫数据框-匹配两个数据框中的两列以更改第三列的值

时间:2020-10-01 16:14:28

标签: python pandas dataframe

我有两个数据帧df1和df2。 df2中的x,y值是df1中x,y值的子集。对于df2中的每个x,y行,我想将df1中的knn列的值更改为0,其中df2 [x] = df1 [x]和df2 [y] = df1 [y]。在下面的示例中,x,y值(1,1)和(1,2)是通用的,因此df1中的knn列将更改为[0,0,0,0]。以下代码中的最后一行不起作用。我将不胜感激。

import pandas as pd

df1_dict = {'x': ['1','1','1','1'],
        'y': [1,2,3,4],
        'knn': [1,1,0,0]
        }

df2_dict = {'x': ['1','1'],
        'y': [1,2]
        }

df1 = pd.DataFrame(df1_dict, columns = ['x', 'y','knn'])
df2 = pd.DataFrame(df2_dict, columns = ['x', 'y'])
df1['knn']= np.where((df1['x']==df2['x']) and df1['y']==df2['y'], 0)

2 个答案:

答案 0 :(得分:6)

您可以在此处使用merge

u = df1.merge(df2,on=['x','y'],how='left',indicator=True)
u = (u.assign(knn=np.where(u['_merge'].eq("both"),0,u['knn']))
     .reindex(columns=df1.columns))

print(u)

   x  y  knn
0  1  1    0
1  1  2    0
2  1  3    0
3  1  4    0

答案 1 :(得分:4)

您可以使用MultiIndex.isin

c = ['x', 'y']
df1.loc[df1.set_index(c).index.isin(df2.set_index(c).index), 'knn'] = 0

   x  y  knn
0  1  1    0
1  1  2    0
2  1  3    0
3  1  4    0