我正在比较两个基于 ID 的数据框,然后使用以下代码合并它们:
df = df1.merge(df2, on=id, suffixes=('_x','_y'))
df1
name age id salary
0 Smith 30 2 2000
1 Ron 24 3 30000
2 Mike 35 4 40000
3 Jack 21 5 5000
4 Roshan 20 6 60000
5 Steve 45 8 8000
6 Peter 28 1 1000
df2
name age salary id
0 Peter 32 10000 1
1 Smith 30 1500 2
2 Ron 24 7000 3
3 Mike 35 20000 4
4 Jack 21 5000 5
5 Cathy 20 9000 6
6 Steve 45 56000 8
对/对
name_x age_x id salary_x name_y age_y salary_y
0 Smith 30 2 2000 Smith 30 1500
1 Ron 24 3 30000 Ron 24 7000
2 Mike 35 4 40000 Mike 35 20000
3 Jack 21 5 5000 Jack 21 5000
4 Roshan 20 6 60000 Cathy 20 9000
5 Steve 45 8 8000 Steve 45 56000
6 Peter 28 1 1000 Peter 32 10000
现在根据输出,我正在比较 _x 和 _y 列值并将其放入掩码中:
mask = df[cols + '_x'].values == df[cols + '_y'].values
print(mask)
掩饰 o/p
[[ True True False]
[ True True False]
[ True True False]
[ True True True]
[ True False False]
[ True True False]
[False True False]]
基于这个掩码值,我想设置一个条件,如果 false 出现在假设掩码 [1] 中,它应该给我“No MAtch”的累积结果,我可以将其附加到我的输出结果中,例如:
name_x age_x id salary_x name_y age_y salary_y new_column
0 Smith 30 2 2000 Smith 30 1500 No Match
1 Ron 24 3 30000 Ron 24 7000 No Match
2 Mike 35 4 40000 Mike 35 20000 No Match
3 Jack 21 5 5000 Jack 21 5000 MAtch
4 Roshan 20 6 60000 Cathy 20 9000 No Match
5 Steve 45 8 8000 Steve 45 56000 No Match
6 Peter 28 1 1000 Peter 32 10000 No Match
最佳答案
使用numpy.where
与 numpy.all
对于快速矢量化解决方案:
mask = df[cols + '_x'].values == df[cols + '_y'].values
df['new_column'] = np.where(np.all(mask, axis=1) , 'Match','No Match')
print (df)
name_x age_x id salary_x name_y age_y salary_y new_column
0 Smith 30 2 2000 Smith 30 1500 No Match
1 Ron 24 3 30000 Ron 24 7000 No Match
2 Mike 35 4 40000 Mike 35 20000 No Match
3 Jack 21 5 5000 Jack 21 5000 Match
4 Roshan 20 6 60000 Cathy 20 9000 No Match
5 Steve 45 8 8000 Steve 45 56000 No Match
6 Peter 28 1 1000 Peter 32 10000 No Match
感谢 @markuscosinus 的评论,如果需要通过索引选择掩码的第二个 “列”
进行比较 - 这里是 mask[:, 1]
:
df['new_column'] = np.where(mask[:, 1] , 'Match','No Match')
关于python - 比较两个数据框并根据掩码值向数据框添加新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54805145/