首页 > 解决方案 > 为什么 pandas.to_csv 在尝试保留 NaN 时会丢弃数字?

问题描述

给定一个熊猫数据框

 df = pd.DataFrame([(290122, 0.20, np.nan),
                    (1900, 1.20, "ABC")],
                     columns = ("number", "x", "class")
                  )

     number    x class
 0   290122  0.2   NaN
 1     1900  1.2   ABC

然后将其导出到 csv,我想保留 NaN,例如“NULL”或“NaN”,

 df.to_csv("df.csv", encoding="utf-8", index=False, na_rep="NULL")

然而,打开 csv 我得到以下信息:也就是说,第一个单元格中的最后两位数字被删除。

在此处输入图像描述 这是在文本编辑器中打开的输出:

 number,x,class
 2901,0.20,NULL
 1900,1.20,ABC

如前所述,删除 na_rep 参数时,我按预期获得:

 number,x,class
 290122,0.20,
 1900,1.20,ABC

标签: python-3.xpandasexport-to-csv

解决方案


是的,这实际上是 pandas 1.0.0 中的一个错误。在 1.0.1 中修复。请参阅发行说明和https://github.com/pandas-dev/pandas/issues/25099

根据您的数据,快速解决方法可能是:

import numpy as np
import pandas as pd

na_rep = 'NULL'
if pd.__version__ == '1.0.0':
    na_rep_wrk = 8 * na_rep

data = [(290122, 0.20, 'NULL'), (2**40 - 1, 3.20, 'NULL'), (1900, 1.20, "ABC")]
df = pd.DataFrame(data, columns=("number", "x", "class"))

df.to_csv("df.csv", encoding="utf-8", index=False, na_rep=na_rep_wrk)
df2 = pd.read_csv('df.csv', keep_default_na=False)

assert(np.all(df == df2))

这给出了 csv 文件:

number,x,class
290122,0.2,NULL
109951162777,3.2,NULL
1900,1.2,ABC


推荐阅读