Python 比较两个数据帧,并根据掩码值向数据帧添加新列

Python 比较两个数据帧,并根据掩码值向数据帧添加新列,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我正在基于这些ID比较两个数据帧,然后使用以下代码合并它们: df = df1.merge(df2, on=id, suffixes=('_x','_y')) df1 df2 o/p 现在,根据输出,我比较_x和_y列值,并将其放入掩码: mask = df[cols + '_x'].values == df[cols + '_y'].values print(mask) 面罩o/p [[ True True

我正在基于这些ID比较两个数据帧,然后使用以下代码合并它们:

        df = df1.merge(df2, on=id, suffixes=('_x','_y'))    
df1

df2

o/p

现在,根据输出,我比较_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]]  
基于此掩码值,我想设置一个条件,即如果在let say mask[1]中存在false,则它应该给我“不匹配”的累积结果,我可以将其附加到我的输出结果中,如:

        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数组或数据帧,否则它应已采用以下格式:

mask = pd.DataFrame([[ True, True, False],
                     [ True, True, False],
                     [ True, True, False],
                     [ True, True, True],
                     [ True, False, False],  
                     [ True, True, False],  
                     [False, True, False]])
然后,以下代码为您提供了所需的列:

mask.apply(sum, axis=1).apply(lambda x: 'Match' if x==3 else 'No Match')
您可以将此列添加到df


希望有帮助…:

将掩码转换为numpy数组或数据帧,或者它应该已经是这种格式:

mask = pd.DataFrame([[ True, True, False],
                     [ True, True, False],
                     [ True, True, False],
                     [ True, True, True],
                     [ True, False, False],  
                     [ True, True, False],  
                     [False, True, False]])
matches = ['Match' if x else 'No Match' for x in np.all(mask, axis = -1)]
然后,以下代码为您提供了所需的列:

mask.apply(sum, axis=1).apply(lambda x: 'Match' if x==3 else 'No Match')
您可以将此列添加到df

希望有帮助…:

matches = ['Match' if x else 'No Match' for x in np.all(mask, axis = -1)]
将为您提供“匹配”和“不匹配”值的数组,您可以使用以下内容将其添加到数据帧:

df['newColumnName'] = matches 
将为您提供“匹配”和“不匹配”值的数组,您可以使用以下内容将其添加到数据帧:

df['newColumnName'] = matches 
用于快速矢量化解决方案:

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的评论,如果需要,请通过掩码的第二个“列”通过索引进行比较-此处通过掩码[:,1]:

用于快速矢量化解决方案:

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的评论,如果需要,请通过掩码的第二个“列”通过索引进行比较-此处通过掩码[:,1]:


这实际上比我的回答要好。我是numpy模块的新手,我试着找到axis在这里到底在做什么。我可以知道为什么它在一个解决方案中是+1,在另一个解决方案中是-1。@Abhishek你可以检查一下,@jezrael我不认为这是他的意思。轴=-1基本上表示“取最后一个轴”。因为在这个例子中只有两个轴0和1,最后一个轴是1,这就是为什么你可以写1或-1这实际上比我的回答要好我是numpy模块的新手,我试着找出axis到底在做什么。我可以知道为什么在一个解决方案中是+1,在另一个解决方案中是-1。@Abhishek你可以检查和@jezrael我不认为这是他的意思。轴=-1基本上表示“取最后一个轴”。因为在这个例子中只有两个轴0和1,最后一个轴是1,这就是为什么你可以写1或-1,这必须很容易将你的代码转换成一个正确的值。我强烈建议,将您的代码转换成适当的代码一定很容易。我强烈建议