为何Pandas导出大数字至CSV/Excel时数值会改变?技术咨询
这不是Bug,是浮点数精度与默认类型推断导致的问题
首先得明确:你遇到的数值变样和科学计数法显示,本质是float64类型的精度限制加上Pandas默认的数值类型推断逻辑导致的,并不是Pandas的Bug。
为什么会出现这个问题?
float64(双精度浮点数)最多只能精确表示到2^53(约9.007e15)的整数。你的数值34032872653290899这类远大于这个范围,当Pandas默认把这些大整数推断为float64类型时,它们会被自动近似成最接近的可表示浮点数——这就是为什么你看到数值变成了34032872653290900这类近似值。同时,当数值过大时,Excel和CSV默认会用科学计数法显示这些浮点数。
解决方案:从根源上保留精确数值
针对你的场景,有几个可靠的解决办法:
1. 把列转换为字符串类型(最直接)
在保存文件前,将目标列转为字符串类型,这样无论保存成CSV还是Excel,都会完整保留原始数值,不会出现精度丢失或科学计数法:
# 假设你的DataFrame是df,目标列名为'numbers' df['numbers'] = df['numbers'].astype(str) # 保存CSV df.to_csv('output.csv', index=False) # 保存Excel df.to_excel('output.xlsx', index=False)
2. 保存Excel时指定数值格式(适合需保留数值类型的场景)
如果需要在Excel里仍以数值格式显示(而非字符串),可以用xlsxwriter引擎自定义单元格格式,强制以普通数值显示,避免科学计数法:
import pandas as pd writer = pd.ExcelWriter('output.xlsx', engine='xlsxwriter') df.to_excel(writer, sheet_name='Sheet1', index=False) # 获取工作簿和工作表对象 workbook = writer.book worksheet = writer.sheets['Sheet1'] # 创建格式:用'0'表示显示所有整数位,避免科学计数法 num_format = workbook.add_format({'num_format': '0'}) # 应用格式到第一列(假设你的数据在A列) worksheet.set_column('A:A', None, num_format) writer.save()
3. 先检查列类型确认问题
你可以先输出DataFrame的列类型,确认是不是float64导致的问题:
print(df.dtypes)
如果显示float64,就说明确实是类型推断引发的精度丢失。
内容的提问来源于stack exchange,提问作者Mehdi
相关产品推荐
相关产品推荐

