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方法能解决,但我觉得根本不该出现这种问题。
示例数据
| index | EAN | product |
|---|---|---|
| 18492 | 615357122276.9999 | Taylors Pure Assam musta tee 20ps |
| 18493 | 615357122252.9999 | Taylors hauduke 20pss lemon ginger |
| 18494 | 615357119764.9999 | Taylors green jasmine leaf tea 125g |
| 18495 | 615357119703.0001 | Taylors 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
相关产品推荐
相关产品推荐

