对比数组长度不等的DataFrame相邻列并设置状态报错求助
问题分析与解决方案
修正后的原始DataFrame代码
原代码存在字符串引号格式、后续变量引用大小写不匹配等问题,修正后的可运行代码如下:
import pandas as pd import numpy as np df = pd.DataFrame({ 'ID1': ['1', '2', '2', '3','4','4', '5', '6', '6', '6', '7'], 'ID2':['a', 'a','b', 'a', 'a', 'b', 'a','a', 'b','c','a'], 'AMT1':['1','2', '3', '4', '5','6', np.nan, np.nan, np.nan, np.nan, np.nan], 'AMT 2': ['1', '3', '3', '4', '6', '7', '1', '2', '3','4', '5'], 'SAL1':['100','200','300','400', '500', '600', np.nan, np.nan, np.nan, np.nan, np.nan], 'SAL_2': ['100', '200', '300', '400', '600', '500', '100', '200', '300', '400', '500'], 'NAME 3': ['A1', 'A2', 'A3', 'A4', 'A5', 'A6', np.nan, np.nan, np.nan, np.nan, np.nan], 'NAME_4': ['A1', 'A2', 'A3', 'A4', 'A6', 'A7', np.nan, np.nan, np.nan, np.nan, np.nan], 'EMAIL 3': ['E1', 'E2', 'E3', 'E4', 'E5', 'E6', np.nan, np.nan, np.nan, np.nan, np.nan], 'EMAIL 4': ['E1', 'E3', 'E3', 'E4', 'E7', 'E8', np.nan, np.nan, np.nan, np.nan, np.nan] })
错误原因分析
方法1错误原因
filter(like)不支持通配符:df.filter(like="_*1")中的like参数仅匹配包含指定子串的列,不支持*通配符,导致返回空DataFrame。将空DataFrame转为numpy数组后维度为(11, 0),调用np.all(..., axis=1)时,因数组无1轴触发axis 1 is out of bound错误。- 列匹配逻辑错误:代码试图用
like="2"匹配所有第二列,但实际列名后缀规则不统一(如AMT 2、SAL_2),无法通过单一子串匹配目标列。 - 变量大小写不一致:定义条件时用
Cond1,后续引用时用cond1,会触发变量未定义错误。
方法2错误原因
- 逻辑未覆盖所有列对:
df.iloc[:,2:]包含8列(4组列对),但lambda仅对比了前两列,未检查其余3组列对,不符合需求。 - 空值处理缺失:未判断列对中是否存在空值,仅简单对比值相等,无法满足“任意列对含空值则Status为FAIL”的规则。
- 潜在维度风险:若操作失误导致
df.iloc[:,2:]返回空列,会直接触发轴越界错误。
正确实现方案
实现思路
- 明确需要对比的列对;
- 对每组列对生成两个条件:两列都非空、两列值相等;
- 所有列对的条件都满足时,Status设为
PASS,否则为FAIL。
代码实现
# 定义需要对比的列对 column_pairs = [ ('AMT1', 'AMT 2'), ('SAL1', 'SAL_2'), ('NAME 3', 'NAME_4'), ('EMAIL 3', 'EMAIL 4') ] # 生成所有列对的匹配条件 conditions = [] for col1, col2 in column_pairs: # 条件:两列都非空,且值完全相等 cond = df[col1].notna() & df[col2].notna() & (df[col1] == df[col2]) conditions.append(cond) # 所有条件都满足则标记为PASS,否则为FAIL df['Status'] = np.all(pd.concat(conditions, axis=1), axis=1).map({True: 'PASS', False: 'FAIL'}) # 查看结果 print(df)
输出结果示例
ID1 ID2 AMT1 AMT 2 SAL1 SAL_2 NAME 3 NAME_4 EMAIL 3 EMAIL 4 Status 0 1 a 1 1 100 100 A1 A1 E1 E1 PASS 1 2 a 2 3 200 200 A2 A2 E2 E3 FAIL 2 2 b 3 3 300 300 A3 A3 E3 E3 PASS 3 3 a 4 4 400 400 A4 A4 E4 E4 PASS 4 4 a 5 6 500 600 A5 A6 E5 E7 FAIL 5 4 b 6 7 600 500 A6 A7 E6 E8 FAIL 6 5 a NaN 1 NaN 100 NaN NaN NaN NaN FAIL 7 6 a NaN 2 NaN 200 NaN NaN NaN NaN FAIL 8 6 b NaN 3 NaN 300 NaN NaN NaN NaN FAIL 9 6 c NaN 4 NaN 400 NaN NaN NaN NaN FAIL 10 7 a NaN 5 NaN 500 NaN NaN NaN NaN FAIL
内容的提问来源于stack exchange,提问作者Priyanka Kumari
相关产品推荐
相关产品推荐

