pandas.read_csv 的 na_values 默认值问题

3 投票
1 回答
6958 浏览
提问于 2025-04-30 16:35

Pandas在从csv、Excel、sql等导入数据时,会自动把某些值转换成NaN(表示缺失值)。

我想问的是,这些默认会被转换的值有哪些呢?

我注意到字符串"NA"会被自动转换。正如其他人提到的,你可以通过在调用导入数据的函数时传入keep_default_na=False来关闭这种自动转换(比如使用pandas.io.parsers.read_csv)。

不过,我不知道除了"NA"之外,还有哪些值会被自动转换。在文档中,我只找到关于keep_default_na参数的以下描述:

keep_default_na : 布尔值,默认是True 如果指定了na_values并且keep_default_na为False,默认的NaN值会被覆盖,否则会被添加到列表中。

我想知道的就是,前面提到的那些“默认NaN值”到底是什么?

暂无标签

1 个回答

1

杰夫在差不多一年前提供了一个链接,但因为跟踪链接比较麻烦,所以我把信息搬到这里来了。

['-1.#IND', '1.#QNAN', '1.#IND', '-1.#QNAN', '#N/A','N/A', 'NA', '#NA', 'NULL', 'NaN', '-NaN', 'nan', '-nan']

来源:http://pandas.pydata.org/pandas-docs/stable/io.html#na-values

不过

这个列表并不完整。

import pandas as pd
from StringIO import StringIO

sio = StringIO()
sio.write('"foo","bar"\n"1",""\n"NA","4"')
sio.seek(0)
pd.read_csv(sio, sep=",", quotechar='"')
   foo  bar
0    1  NaN
1  NaN    4

注意,空字符串没有在列表中,但它默认还是会被解析为NaN(不是一个数字)?

pd.read_csv(sio, sep=",", quotechar='"',
            keep_default_na=False,
            na_values=['-1.#IND', '1.#QNAN', '1.#IND',
                       '-1.#QNAN', '#N/A','N/A', '#NA', 'NA'
                       'NULL', 'NaN', '-NaN', 'nan', '-nan'])

  foo bar
0   1    
1 NaN   4

如果这个列表是默认的,这两个命令应该产生完全相同的结果。

但实际上并不是。

如果你想复现pandas.read_csv的默认行为,你需要这个列表:

['', '-1.#IND', '1.#QNAN', '1.#IND', '-1.#QNAN', '#N/A','N/A', 'NA', '#NA', 'NULL', 'NaN', '-NaN', 'nan', '-nan']

这里是Pandas版本的参考:

pd.__version__
'0.15.2'

Pandas的bug报告:

https://github.com/pydata/pandas/issues/10700

更新

这个问题在Pandas 0.17版本中已经修复。

撰写回答