我有2个数据框,如下所示:

df1:

ID   col1   col2
1     A1     B1
2     A2     B2
3     A3     B3
4     A4     B4
5     A5     B5
6     A6     B6


df2:

col1   col2
 A1     B1
 A2     O5
 H3     B3
 A4     B4
 A5     66
 A6     C6


预期结果:我想根据条件生成结果df-df1的col1,col2中的每个值都应存在于df2的col1,col2值中

预期结果df:

ID   col1   col2     Error
1     A1     B1      No mismatch with df2
2     A2     B2      col2 mismatch with df2
3     A3     B3      col1 mismatch with df2
4     A4     B4      No mismatch with df2
5     A5     B5      col2 mismatch with df2
6     A6     B6      col2 mismatch with df2

最佳答案

创建具有字典理解力的帮助器DataFrame并与isin进行比较:

m = pd.DataFrame({c: ~df1[c].isin(df2[c]) for c in ['col1','col2']})
print (m)
    col1   col2
0  False  False
1  False   True
2   True  False
3  False  False
4  False   True
5  False   True


然后用numpy.whereany屏蔽的True用于测试每行至少一个dot,并使用矩阵乘法的用于获取列名:

df1['Error'] = np.where(m.any(axis=1),
                        m.dot(m.columns + ', ').str.rstrip(', ') + ' mismatch with df2',
                       'No mismatch with df2')
print (df1)
   ID col1 col2                   Error
0   1   A1   B1    No mismatch with df2
1   2   A2   B2  col2 mismatch with df2
2   3   A3   B3  col1 mismatch with df2
3   4   A4   B4    No mismatch with df2
4   5   A5   B5  col2 mismatch with df2
5   6   A6   B6  col2 mismatch with df2

08-28 02:21
查看更多