如何修复因空字符串被识别为字符串类型的Pandas数值列
问题
我有一个Pandas DataFrame,其中部分列应为数值类型,但因存在空字符串,这些列被错误识别为object类型。如何移除空字符串并将列转换为正确的int/float类型?
假设A列数据如下:
2 1 0 '' NULL Name: A, dtype: object
期望的A列应为:
2 1 0 NULL NULL Name: A, dtype: int
我尝试了以下代码,但数据类型未改变,数字仍被视为字符串:
print(df[col].dtypes) df[col].replace(r'^\s*$', np.nan, regex=True, inplace=True) print(df[col].dtypes)
输出结果:
object object
我不想使用str.isnumeric()转换数据类型,因为这会影响其他真实字符串列,有没有更好的方法?
解决方案
方法1:用pd.to_numeric()直接转换(推荐)
pd.to_numeric()是处理这类场景的最优方案,它会自动尝试将字符串转为数值,无法转换的内容可指定转为缺失值,且仅针对目标列操作,不会影响其他字符串列。
代码示例:
import pandas as pd import numpy as np # 针对目标列执行转换,无法转数值的内容转为NaN df[col] = pd.to_numeric(df[col], errors='coerce') # 转为可空整数类型(普通int不支持NaN,大写I的Int64是Pandas提供的可空类型) df[col] = df[col].astype('Int64')
方法2:先替换空值再转换
如果需要先统一处理空字符串、'NULL'这类标记值,再转换类型:
# 把空字符串、'NULL'、空白字符串统一替换为NaN df[col] = df[col].replace(['', 'NULL', r'^\s*$'], np.nan, regex=True) # 转换为数值类型再转可空整数 df[col] = pd.to_numeric(df[col]).astype('Int64')
原代码失效原因
你之前只做了空字符串替换,但replace操作不会自动修改列的 dtype——替换后列中同时存在字符串类型的数字和浮点型的NaN,所以依然是object类型,必须显式调用转换函数来变更类型。
内容的提问来源于stack exchange,提问作者szheng
相关产品推荐
相关产品推荐

