查找列之间不匹配的条目并遍历列

Dev*_*vin 8 python numpy pandas

我有两个需要验证的数据集。所有记录都应该匹配。我无法确定如何遍历每个不同的列。

import pandas as pd 
import numpy as np

df = pd.DataFrame([['charlie', 'charlie', 'beta', 'cappa'], ['charlie', 'charlie', 'beta', 'delta'], ['charlie', 'charlie', 'beta', 'beta']], columns=['A_1', 'A_2','B_1','B_2'])

df.head()

Out[83]: 
       A_1      A_2   B_1    B_2
0  charlie  charlie  beta  cappa
1  charlie  charlie  beta  delta
2  charlie  charlie  beta   beta
Run Code Online (Sandbox Code Playgroud)

例如,在上面的代码中,我想将 A_1 与 A_2 和 B_1 与 B_2 进行比较,以分别返回一个新列 A_check 和 B_check,如果 A_1 与 A_2 匹配作为 A_Check,则返回 True。

像这样的东西:

df['B_check'] = np.where((df['B_1'] == df['B_2']), 'True', 'False')
df_subset = df[df['B_check']=='False'] 
Run Code Online (Sandbox Code Playgroud)

但是可以遍历任何给定的列名,其中需要检查的列在下划线之前始终具有相同的名称,并且在下划线之后始终具有 1 或 2。

最终,实际任务有多个数据框,要检查的列数不同,要检查的列数也不同。我最终想要的输出是一个数据框,它显示了任何特定列检查的所有错误记录。

Grz*_*ski 6

使用更全面的正则表达式:

from itertools import groupby
import re

for k, cols in groupby(sorted(df.columns), lambda x: x[:-2] if re.match(".+_(1|2)$", x) else None):
    cols=list(cols)
    if(len(cols)==2 and k):
        df[f"{k}_check"]=df[cols[0]].eq(df[cols[1]])
Run Code Online (Sandbox Code Playgroud)

它只会将名称结尾的列配对在一起,_1_2不管您之前的名称是什么,_check仅在有 2-_1_2(假设您没有 2 列具有相同名称的情况下)进行计算。

对于样本数据:

       A_1      A_2   B_1    B_2  A_check  B_check
0  charlie  charlie  beta  cappa     True    False
1  charlie  charlie  beta  delta     True    False
2  charlie  charlie  beta   beta     True     True
Run Code Online (Sandbox Code Playgroud)