Pandas中人工与材料成本列Object类型转Float类型失败求助
解决Object类型转Float类型的问题
看起来你在将Labour Cost和Material Cost列从Object类型转换为Float类型时遇到了阻碍,我来帮你梳理下可行的方案,同时分析下之前方法无效的原因。
先分析之前方法无效的原因
- 你尝试的第一个代码:
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这样的小数部分,导致数据失真。
- 第二个代码:
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
相关产品推荐
相关产品推荐

