python - 比较两个数据框并根据掩码值向数据框添加新列

标签 python pandas numpy dataframe

我正在比较两个基于 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.wherenumpy.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/

相关文章:

python - 如何在 pandas loc 过滤条件中传递 "Take All"参数?

python - 如何将来自不同列的所有相关值放在一起

python - 使用 scrapy 抓取多个页面

python - 如何将 urlencode 更改为 python 字典

python - 更改 Bokeh 图中选项卡的样式

python - 根据多个条件设置numpy数组的值

python - 使用 slider 编辑颜色值

python - 何时在 GAE 中使用 try/except block

python - 如何比较两个不同数据帧的数据

python - 如何返回numpy数组中两个数字之间的值索引