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

Pandas中人工与材料成本列Object类型转Float类型失败求助

解决Object类型转Float类型的问题

看起来你在将Labour Cost和Material Cost列从Object类型转换为Float类型时遇到了阻碍,我来帮你梳理下可行的方案,同时分析下之前方法无效的原因。

先分析之前方法无效的原因

  1. 你尝试的第一个代码:
df_co.iloc[:,2:3].apply(lambda x : x.str.extract('(\d+)',expand=False).astype(float))
  • 问题一:iloc[:,2:3]只选中了Labour Cost列,但没有将转换后的结果赋值回原DataFrame,相当于白运行了;
  • 问题二:正则(\d+)只能提取整数部分,会丢失像351.42这样的小数部分,导致数据失真。
  1. 第二个代码:
df_co['Labour Cost'].astype(float)
  • astype(float)对格式要求非常严格,如果列中存在任何非数字字符(比如隐藏空格、特殊符号)或者空值,就会直接报错,无法完成转换。

可行的转换方案

方案一:用pd.to_numeric(最稳健推荐)

这个方法会自动处理大部分格式问题,比如空格、逗号分隔的数字,还能把无效值转为NaN方便后续处理,非常省心:

import pandas as pd

# 转换Labour Cost列
df_co['Labour Cost'] = pd.to_numeric(df_co['Labour Cost'], errors='coerce')
# 转换Material Cost列
df_co['Material Cost'] = pd.to_numeric(df_co['Material Cost'], errors='coerce')
  • errors='coerce'参数:遇到无法转换的值时,会将其转为NaN,而不是直接抛出错误。
  • 如果之后需要处理NaN,可以用df_co['Labour Cost'].fillna(0, inplace=True)这样的方法填充。

方案二:先清理字符再转换

如果你的列里有明显的非数字字符(比如货币符号、空格),可以先清理再转换:

# 清理Labour Cost列:去除空格,保留数字和小数点
df_co['Labour Cost'] = df_co['Labour Cost'].str.strip().str.replace(r'[^0-9.]', '', regex=True).astype(float)
# 清理Material Cost列
df_co['Material Cost'] = df_co['Material Cost'].str.strip().str.replace(r'[^0-9.]', '', regex=True).astype(float)
  • str.strip()去除首尾空格;
  • str.replace(r'[^0-9.]', '', regex=True)删除所有非数字、非小数点的字符。

方案三:修正正则提取的方法

如果你坚持用str.extract,需要修改正则表达式来匹配小数:

df_co['Labour Cost'] = df_co['Labour Cost'].str.extract(r'(\d+\.?\d*)', expand=False).astype(float)
df_co['Material Cost'] = df_co['Material Cost'].str.extract(r'(\d+\.?\d*)', expand=False).astype(float)
  • 正则(\d+\.?\d*)可以匹配整数(比如192)和小数(比如351.42)。

验证转换结果

转换完成后,可以运行下面的代码确认数据类型是否正确:

print(df_co[['Labour Cost', 'Material Cost']].dtypes)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:24:43