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。
最终,实际任务有多个数据框,要检查的列数不同,要检查的列数也不同。我最终想要的输出是一个数据框,它显示了任何特定列检查的所有错误记录。
使用更全面的正则表达式:
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)