使用apply结合pd.to_numeric转换DataFrame列时报'list'对象无apply方法错误
报错核心原因
你写的代码存在三个层面的问题:
- 方法调用的对象错误:
wrong_type_columns是存储待转换列名的普通Python列表,列表结构本身没有apply方法——apply是pandas Series、DataFrame对象的专属方法,这是触发AttributeError: 'list' object has no attribute 'apply'的直接原因。 - 原列名列表存在语法疏漏:列表中
VisibilityHighMiles字段漏写了开头的单引号,会在代码加载阶段直接触发语法错误。 - apply参数配置错误:就算将调用对象替换为合法的pandas对象,你写的
axis=1参数也不符合按列做类型转换的需求,按行遍历的逻辑无法完整读取列内容完成数值转换。
正确实现方案
列名列表的作用是定位DataFrame中需要做类型转换的目标列,不能直接对列名列表本身做转换操作,正确的操作流程如下:
- 确保原始气象数据存储在
pd.DataFrame对象中,假设数据框命名为df - 通过列名列表从数据框中切出目标列的子集,对子集执行
pd.to_numeric强制转换,传入errors='coerce'自动将无法解析为数值的无效值置为NaN - 转换完成后根据业务需求做后续类型适配
对应的可运行代码:
# 修正语法问题后的待转换列名列表 wrong_type_columns = [ 'DewPointHighF', 'DewPointAvgF', 'DewPointLowF', 'HumidityHighPercent', 'HumidityAvgPercent', 'HumidityLowPercent', 'SeaLevelPressureHighInches', 'SeaLevelPressureAvgInches', 'SeaLevelPressureLowInches', 'VisibilityHighMiles', 'VisibilityAvgMiles', 'VisibilityLowMiles', 'WindHighMPH', 'WindAvgMPH', 'WindGustMPH', 'PrecipitationSumInches' ] # 逐列执行数值强制转换 for col in wrong_type_columns: df[col] = pd.to_numeric(df[col], errors='coerce')
如果要使用批量简写写法,需要先从数据框中取出目标列的子DataFrame,再调用apply,示例:
df[wrong_type_columns] = df[wrong_type_columns].apply( lambda col: pd.to_numeric(col, errors='coerce') )
注意:
errors='coerce'会把无法转换的内容生成NaN空值,此时如果直接调用.astype(int)会触发类型报错——因为pandas默认的原生int类型不支持空值。如果需要转换为整型,可选择两种处理方式:
- 先填充空值(比如填充为0)再做整型转换
- 直接使用支持空值的扩展整型类型:在转换结果后追加
.astype('Int64')
内容的提问来源于stack exchange,提问作者asairi nava
相关产品推荐
相关产品推荐

