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

使用pandas.to_csv保留NaN时为何出现数字丢失问题?

问题原因及解决方法

首先得说,正常情况下你贴的代码导出的CSV应该是完全正确的——第一行的number列就是完整的290122,不会平白无故丢两位。你遇到的这个问题,大概率是以下几个场景之一:

1. 读取工具的自动格式化搞的鬼

这是最常见的原因!很多工具(比如旧版Excel、某些轻量文本编辑器)在打开CSV时,会自作主张把数字列识别成其他类型,导致显示异常。举个例子:有些工具会把6位数字当成YYMMDD的日期格式,290122就会被解析成2029年1月22日,结果显示的时候只截了前四位2901;还有的工具会把长数字自动转成科学计数法,也可能出现显示截断的情况。

验证方法:用Notepad++、VS Code这类纯文本编辑器直接打开导出的CSV文件,查看原始内容。如果原始内容里290122是完整的,那就是工具显示的锅,不是pandas导出的问题。

2. 老旧pandas版本的bug

如果你用的是非常老的pandas版本(比如0.1x系列),确实可能存在na_rep参数影响数值列导出的奇怪bug。毕竟早期pandas的CSV导出逻辑还没那么完善。

解决方法:把pandas升级到最新的稳定版(比如1.x或2.x系列),再跑一次导出代码试试,大概率就能解决。

3. 换行符/编码的兼容性问题

虽然你指定了encoding="utf-8",但不同系统的换行符(Windows用CRLF,Unix/Linux用LF)可能被某些编辑器处理不当,导致行内容错位,看起来像是数字被截断。比如某一行的换行符没被正确识别,下一行的内容跑到了当前行,把最后两位覆盖了。

验证方法:用纯文本编辑器打开后,开启显示换行符的功能(比如VS Code里按Ctrl+Shift+P,输入Toggle Render Whitespace),看看每一行的结尾是不是正常的换行符。

4. 数据类型的隐性转换

虽然你给的原始数据里number列是整数,但有时候可能因为某些操作(比如之前处理过DataFrame)导致number列被转换成了float64或者object类型,这也可能影响导出时的格式。

验证方法:导出前先跑一下print(df.dtypes),确认number列是int64类型。


针对性的解决办法

  • 如果是工具显示问题:用Excel导入CSV时,手动把number列设置为文本格式;或者导出时给非数值列加引号,强制工具识别为文本,代码如下:
    import csv
    df.to_csv("df.csv", encoding="utf-8", index=False, na_rep="NULL", quoting=csv.QUOTE_NONNUMERIC)
    
  • 如果是pandas版本问题:直接升级pandas,用pip install --upgrade pandas即可;
  • 如果是换行符/编码问题:导出时指定换行符参数,比如lineterminator='\r\n'(适配Windows系统)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:12:41