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

如何将普通列表转为嵌套列表以解决apply属性不存在报错

问题描述

我有一个列表,想要用它调用函数从名为valid的JSON中检测无效值,但出现了AttributeError错误,提示“列表对象没有apply属性”。

代码如下:

col_list=[col for col in df]
key=list(valid.keys())
for k in key:
    if k not in col_list:
        key.remove(k)

print(key)
#Key values ['industry', 'System_Type__c', 'AccountType', 'country', 'state']

mask = key.apply(lambda c: c.isin(valid[c.name]))
key.mask(mask|key.eq(' ')).stack()
for err_i, (r, v) in enumerate(key.mask(mask|key.eq(' ')).stack().iteritems()):
    errors[filename][err_i] = {"row": r[0],
                               "column": r[1],
                               "message": v + " is invalid check column " + r[1] + ' and replace with a standard value'}

我发现如果将key改为嵌套列表形式,例如:

df1=[['industry', 'System_Type__c', 'AccountType', 'country', 'state']]

代码就能正常运行,但普通列表不行。请问如何将普通列表转为嵌套列表,让变量key可以使用apply方法?

解决方法

核心问题:apply、isin、mask都是Pandas DataFrame/Series专属方法,普通Python列表没有这些属性。你之前用嵌套列表能运行,是因为嵌套列表被隐式转换成了DataFrame,而非嵌套列表本身支持这些方法。

正确处理步骤

  1. 将普通列表关联到DataFrame
    你要检测的是df中对应列的无效值,所以直接从df中提取key对应的列,得到可操作的DataFrame对象:
# 从原df中筛选key对应的列,得到可操作的DataFrame
key_df = df[key]
  1. 修正检测逻辑代码
    用转换后的key_df替换原代码中的key,后续方法调用就能正常执行:
# 生成每列的有效值掩码:值在valid对应列表中则为True
mask = key_df.apply(lambda c: c.isin(valid[c.name]))
# 标记有效/空值,保留无效值并堆叠为Series
invalid_values = key_df.mask(mask | key_df.eq(' ')).stack()
# 遍历收集错误信息
for err_i, (r, v) in enumerate(invalid_values.iteritems()):
    errors[filename][err_i] = {
        "row": r[0],
        "column": r[1],
        "message": f"{v} is invalid, check column {r[1]} and replace with a standard value"
    }
  1. 如果只是单纯要把普通列表转嵌套列表
    如果只是为了转格式(不推荐,因为还是要转DataFrame才能用apply),直接用:
nested_key = [key]

但这只是把一维列表包成二维,本身还是Python列表,依然不能直接调用apply,必须再转成DataFrame:

import pandas as pd
key_df = pd.DataFrame(nested_key)

内容的提问来源于stack exchange,提问作者user19788086

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:01:05