如何避免Pandas DataFrame导出CSV时ID变为科学计数法?
导出DataFrame到CSV时ID列被转为科学计数法的问题
模拟DataFrame代码:
import pandas as pd sof = pd.DataFrame({ 'id':['1580326032400705442181105','15803260000063243713608360','1580326343500677412104013','15803260343000000705432103406'], 'class':['a','c','c','d'] })
使用to_csv导出后,ID列被自动转为科学计数法(如1.5803260324007E+24),有两个疑问:
- 为何Python会将明显为object类型的列转换为数值格式?
- 如何保留ID的原始格式?
已尝试的方法及问题:
- 使用
float_format='%f'参数导出:
无效果。sof.to_csv('path',float_format='%f',index = False) - 将id列转为int再转string:
报错:sof['id'].astype(int).astype(str)OverflowError: Python int too large to convert to C long
解答
1. 为什么object类型列导出后显示为科学计数法?
不是Python/pandas把object列转成了数值格式,pandas导出CSV时会完整保留字符串的原始内容。问题出在打开CSV的工具(比如Excel):工具会自动识别长数字串为数值类型,但这类超长ID超出了工具数值类型的存储范围,于是自动用科学计数法显示。
2. 保留ID原始格式的解决方法
方法1:给ID列添加单引号前缀
让工具将ID识别为文本类型,避免自动转数值:
# 给每个ID前加单引号 sof['id'] = "'" + sof['id'] # 导出CSV sof.to_csv('your_path/filename.csv', index=False)
打开CSV时,单引号会让工具(如Excel)将ID视为文本,完整显示原始内容。
方法2:使用quoting参数强制包裹非数值列
借助csv模块的参数,让pandas导出时用引号包裹所有非数值列,工具会识别为文本:
import csv sof.to_csv('your_path/filename.csv', index=False, quoting=csv.QUOTE_NONNUMERIC)
方法3:确保ID列始终为字符串类型(避免不必要的类型转换)
你之前尝试转int再转string报错,是因为numpy的int类型有长度限制(受C long的范围约束),但Python原生的字符串完全可以存储超长ID,所以不需要转int,直接保持ID列的字符串类型即可。只要导出时确保列类型是object(字符串),再配合上面的方法,就能避免科学计数法问题。
内容的提问来源于stack exchange,提问作者Pradeep Chintapalli
相关产品推荐
相关产品推荐

