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

Pandas read_excel读取整数时出现.999/.001尾缀浮点数问题

Pandas读取Excel时EAN编码出现浮点数精度问题的解决

我用Pandas的read_excel读取商品数据的.xlsx文件到DataFrame,原本应该是整数的EAN(UPC)编码,读出来变成了带.999或.001尾缀的浮点数。我用Excel和Numbers检查过原文件,所有EAN都是整数,调大小数位数后显示的是.000。如果在read_excel里指定dtype=int,带.001的能正常显示,但带.999的会被截断小数部分;不指定dtype的话,这列就是float64类型。用round方法能解决,但我觉得根本不该出现这种问题。

示例数据

indexEANproduct
18492615357122276.9999Taylors Pure Assam musta tee 20ps
18493615357122252.9999Taylors hauduke 20pss lemon ginger
18494615357119764.9999Taylors green jasmine leaf tea 125g
18495615357119703.0001Taylors musta irtotee 125g English Break

问题原因

这是浮点数精度误差导致的:Excel里的大整数(比如12位的EAN)在存储时可能被转换成二进制浮点数,虽然Excel界面显示为整数,但底层存储存在微小精度损失,Pandas读取时就暴露了这个问题。

解决方法

  • 直接按字符串读取(最稳妥):EAN是标识编码,无需数值计算,直接读成字符串彻底避免精度问题:

    import pandas as pd
    df = pd.read_excel("your_file.xlsx", dtype={"EAN": str})
    
  • 读取后修正浮点数:如果已经读成float类型,用四舍五入转整数再转字符串(避免科学计数法):

    df["EAN"] = df["EAN"].round().astype(int).astype(str)
    

    也可以用numpy的rint()更精准:

    import numpy as np
    df["EAN"] = np.rint(df["EAN"]).astype(int).astype(str)
    
  • 用converters自定义转换:读取时指定转换器,直接把浮点数转成整数字符串:

    def convert_ean(value):
        return str(int(round(value))) if pd.notna(value) else value
    
    df = pd.read_excel("your_file.xlsx", converters={"EAN": convert_ean})
    

内容的提问来源于stack exchange,提问作者sajo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:37:31