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

3

我有两个数据框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个回答

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
非常感谢。解决了我的问题。现在我需要在一个有100万行的数据集上进行测试,并查看它需要多长时间才能遍历整个数据集。 - rverma

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接