Pandas字段转字符串时出现.0后缀、nan字符串如何解决
问题根因
- 数值带
.0后缀:包含空值的数值列在pandas中默认会被存储为float64类型(pandas 1.0版本前原生整数类型不支持空值存储),直接对float类型列执行astype(str)时,整数值的浮点数会自动保留.0后缀。 - 出现字符串
"nan":直接对包含np.nan的列做字符串转换时,空值会被转为字符串"nan",不再是空值类型。 - 你之前的代码无效:链式切片
my_df[my_df['ID_1'].notnull()].ID_1生成的是DataFrame副本,在副本上做的类型转换没有赋值回原DataFrame,原列数据没有任何修改。
修复方案
方案1:读入Excel阶段直接处理(推荐,从源头避免问题)
用read_excel的converters参数指定ID列的转换规则,不需要读完后二次转类型:
import pandas as pd import numpy as np def id_convert(value): # 统一识别所有空值形式 if pd.isna(value) or str(value).strip() in ('', 'None', 'nan'): return np.nan # 浮点数转整数后再转字符串,自动去掉.0后缀 return str(int(float(value))) my_df = pd.read_excel( "你的源文件路径.xlsx", converters={ "ID_1": id_convert, "ID_2": id_convert } )
方案2:已读入DataFrame的修复方式
不要在切片副本上操作,把处理结果直接赋值回原列:
import pandas as pd import numpy as np # 统一替换所有形式的空值为标准np.nan for col in ["ID_1", "ID_2"]: my_df[col] = my_df[col].replace(["None", "nan", ""], np.nan) # 非空值转浮点数→整数→字符串,空值保留np.nan my_df[col] = my_df[col].apply(lambda x: str(int(float(x))) if pd.notna(x) else np.nan)
如果你使用pandas 1.0及以上版本,也可以用可空整数类型简化处理:
for col in ["ID_1", "ID_2"]: my_df[col] = ( my_df[col] .replace(["None", "nan", ""], np.nan) .astype("Int64") # 大写I的可空整数类型,支持存储pd.NA .astype(str) .replace("<NA>", np.nan) # 把转字符串后生成的<NA>换回标准空值 )
内容的提问来源于stack exchange,提问作者funkurlif3
相关产品推荐
相关产品推荐

