pandas读取CSV时'.'被识别为字符串 无法将数值列转为float怎么办
问题根因
- 初始读取代码的
na_values参数仅将空格识别为缺失值,未覆盖数据中作为缺失标记的单独.,导致pandas将.判定为普通字符串,数值列无法自动解析为浮点型 - 初始代码错误配置
thousands='.':你的数据中.是小数分隔符而非千分位符号,该配置会直接打乱pandas的数值解析逻辑 - 第二次执行
replace操作时未将返回值重新赋值给原DataFrame,pandas默认不直接修改原对象,替换操作实际未生效,因此后续pd.to_numeric仍会碰到.字符串抛出解析错误
最优解法:读取CSV时直接配置参数一步完成
最省事的方案是在读取阶段就正确配置缺失值规则,删掉错误的千分位配置,读入后数据直接是正确类型:
import pandas as pd import numpy as np stirs = pd.read_csv( r'C:/Users/Owner/Documents/Research/SOMA/FRED_reserves/SOMArates4.csv', na_values=['.', ' '], # 同时将空格、单独的.识别为缺失值 usecols=[0,1,2,3,4,5], parse_dates=['DATE'] ).fillna(value=0) # 执行后可通过dtypes属性验证类型,数值列会自动解析为float64 stirs.dtypes
已读入数据的修复方案
如果不想重新读取文件,可按如下步骤修复已生成的object类型列:
# 1. 精准匹配单独的.替换为缺失值,注意赋值回原DataFrame,正则^\.$只匹配单个.的字符串,不会误改数值里的小数点 stirs = stirs.replace(to_replace=r'^\.$', value=np.nan, regex=True) # 2. 批量转换除日期列外的所有列为数值类型,errors='coerce'会自动将无法解析的异常值转为NaN,不会抛出错误 num_columns = stirs.columns.drop('DATE') stirs[num_columns] = stirs[num_columns].apply(pd.to_numeric, errors='coerce') # 3. 按需求填充缺失值为0 stirs = stirs.fillna(value=0)
内容的提问来源于stack exchange,提问作者nahammond
相关产品推荐
相关产品推荐

