查找列之间不匹配的条目并循环访问列

我有两个需要验证的数据集。所有记录都应匹配。我在确定如何循环访问每个不同的列时遇到问题。


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

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


像这样:


df['B_check'] = np.where((df['B_1'] == df['B_2']), 'True', 'False')

df_subset = df[df['B_check']=='False'] 

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


最终,实际任务具有多个数据框,其中要检查的列不同,以及要检查的列数也不同。我最终要获得的输出是一个数据帧,它显示对于任何特定列检查都是假的所有记录。


白衣染霜花
浏览 151回答 4
4回答

LEATH

使用更全面的正则表达式:from itertools import groupbyimport refor 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]])它将仅将名称以和名称结尾的列配对在一起,而不管您之前在其名称中有什么,仅当有2-和(假设您没有2列具有相同名称)时才计算。_1_2_check_1_2对于示例数据:       A_1      A_2   B_1    B_2  A_check  B_check0  charlie  charlie  beta  cappa     True    False1  charlie  charlie  beta  delta     True    False2  charlie  charlie  beta   beta     True     True

临摹微笑

如果您知道列名称的第一部分,则可以使用wide_to_long,即...:A,B(pd.wide_to_long(df.reset_index(), ['A','B'], 'index','part',sep='_')   .groupby('index').nunique().eq(1)   .add_suffix('_check'))输出:       A_check  B_checkindex                  0         True    False1         True    False2         True     True

芜湖不芜

您可以拆分列并按拆分结果的第一个值的序列进行分组,并调用以进行比较axis=1aggi_cols = df.columns.str.split('_')df_check = (df.groupby(i_cols.str[0], axis=1).agg(lambda x: x.iloc[:,0] == x.iloc[:,-1])              .add_suffix('_check'))In [69]: df_checkOut[69]:   A_check  B_check0     True    False1     True    False2     True     True

猛跑小猪

另一种方法是使用 pd 使用数据帧重整。多索引: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.columns = df.columns.str.split('_', expand=True) #Creates MultiIndex column headerdfs = df.stack(0) #move the 'A' and 'B' and any others to rowsdf_out = (dfs == dfs.shift(-1, axis=1))['1'].unstack() #Compare column 1 to column 2 and move 'A's and 'B's back to columns.print(df_out)输出:      A      B0  True  False1  True  False2  True   True
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go
Python