首页 > 解决方案 > 使用 python pandas 检查两列之间的数据匹配和不匹配

问题描述

下面的示例数据

在此处输入图像描述

给出了文件 A 和文件 B 的输入,也给出了输出格式。有人可以帮我吗

标签: pythonpandas

解决方案


这里有四行代码可以满足您的需求:

columns_to_compare =['c2','c3']
dfa['Combo'] = dfa[columns_to_compare].apply(lambda x: ', '.join(x[x.notnull()]), axis = 1)
dfb['Combo1'] = dfb[columns_to_compare].apply(lambda x: ', '.join(x[x.notnull()]), axis = 1)
[i for i,x in enumerate(dfb['Combo1'].tolist()) if x not in dfa['Combo'].tolist()] 

解释

假设您想查看哪些dfb行不在dfa中,对于列c2c3

  • 为此,请考虑以下方法:

在dfa中创建一列“Combo”,其中“Combo”的每一行都包含一个逗号分隔的字符串,表示要比较的所选列的值(对于相关行)

dfa['Combo'] = dfa[dfa.columns].apply(lambda x: ', '.join(x[x.notnull()]), axis = 1)

    c1  c2  c3   c4     Combo
0   v   100 tech hhh    100, tech
1   f   110 jjj  scb    110, jjj
2   h   235 None kkk    235
3   m   999 iii  lop    999, iii
4   s   333 mnp  sos    333, mnp
5   d   39  lf   kdk    39, lf

对dfb应用相同的逻辑

    c1  c2  c3   c4     Combo1
0   v   100 tech hhh    100, tech
1   h   235 None mckkk  235
2   m   999 iii  lok    999, iii
3   f   110 jkl  scb    110, jkl
4   L   777 9kdf ooo    777, 9kdf
5   s   333 mnp1 sos1   333, mnp1

从 dfb 创建一个包含所需索引的列表:

[i for i,x in enumerate(dfb['Combo1'].tolist()) if x not in dfa['Combo'].tolist()] 

或显示实际的行值(不是索引):

[[x] for i,x in enumerate(dfb['Combo1'].tolist()) if x not in dfa['Combo'].tolist()]  

行索引结果

[3, 4, 5]

行值结果

[['110, jkl'], ['777, 9kdf'], ['333, mnp1']]

推荐阅读