You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对比数组长度不等的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:]返回空列,会直接触发轴越界错误。

正确实现方案

实现思路

  1. 明确需要对比的列对;
  2. 对每组列对生成两个条件:两列都非空、两列值相等;
  3. 所有列对的条件都满足时,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 16:42:51