如何将普通列表转为嵌套列表以解决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,而非嵌套列表本身支持这些方法。
正确处理步骤
- 将普通列表关联到DataFrame
你要检测的是df中对应列的无效值,所以直接从df中提取key对应的列,得到可操作的DataFrame对象:
# 从原df中筛选key对应的列,得到可操作的DataFrame key_df = df[key]
- 修正检测逻辑代码
用转换后的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" }
- 如果只是单纯要把普通列表转嵌套列表
如果只是为了转格式(不推荐,因为还是要转DataFrame才能用apply),直接用:
nested_key = [key]
但这只是把一维列表包成二维,本身还是Python列表,依然不能直接调用apply,必须再转成DataFrame:
import pandas as pd key_df = pd.DataFrame(nested_key)
内容的提问来源于stack exchange,提问作者user19788086
相关产品推荐
相关产品推荐

