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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:48:23