获取pandas.read_csv将空值读取为空字符串而不是nan

Bre*_*arn 67 python csv pandas

我正在使用pandas库读取一些CSV数据.在我的数据中,某些列包含字符串.字符串"nan"是可能的值,空字符串也是如此.我设法让大熊猫把"nan"作为一个字符串来读,但我无法弄清楚如何让它不读取空值作为NaN.这是示例数据和输出

One,Two,Three
a,1,one
b,2,two
,3,three
d,4,nan
e,5,five
nan,6,
g,7,seven

>>> pandas.read_csv('test.csv', na_values={'One': [], "Three": []})
    One  Two  Three
0    a    1    one
1    b    2    two
2  NaN    3  three
3    d    4    nan
4    e    5   five
5  nan    6    NaN
6    g    7  seven
Run Code Online (Sandbox Code Playgroud)

它正确地写着"男"为字符串"南",但仍读取空单元格作为NaN的.我想传递strconverters参数read_csv(带converters={'One': str})),但它仍然读取空单元格作为NaN的.

我知道读书,和fillna后,我可以填补值,但真的没有办法告诉大家,在一个特定的CSV列空单元格应该被解读为空字符串,而不是NaN的熊猫吗?

nea*_*mcb 65

阅读其他答案和评论后,我仍然感到困惑.但现在答案似乎更简单,所以你走了.

自Pandas 0.9版(2012年起)以来,您可以通过简单设置来读取空单元格被解释为空字符串的csv keep_default_na=False:

pd.read_csv('test.csv', keep_default_na=False)
Run Code Online (Sandbox Code Playgroud)

这个问题在下面有更清楚的解释

这是在2012年8月19日为Pandas 0.9版本修复的

  • 我希望这是默认值,我不得不用谷歌搜索这个答案的次数...... (6认同)
  • 显然,这是最佳答案,应将其指定为第一个解决方案。谢谢@nealmcb (2认同)

Wes*_*ney 41

我添加了一张票,在这里添加一些选项:

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

在此期间,result.fillna('')应该做你想做的事

编辑:在开发版本(最终为0.8.0)如果指定一个空列表na_values,空字符串将在结果中保留空字符串

  • [文件](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html)为read_csv现在提供两种`na_values`(按列索引列表或字典)和`keep_default_na`(布尔).`keep_default_na`值指示是否应替换或附加pandas的默认NA值.OP的代码目前不起作用只是因为它缺少这个标志.对于此示例,您可以使用`pandas.read_csv('test.csv',na_values = ['nan'],keep_default_na = False)`. (9认同)
  • [`DataFrame.fillna`的文档.](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html)尝试`result.fillna('',inplace = True) `.否则,它会创建数据帧的副本. (8认同)
  • 又遇到这个了。修复很简单(最好的答案如下所示,放置 `keep_default_na=False`),但 pandas 对此的默认行为在我看来是不好的。如果由于某种原因 pandas read_csv 推断某列不是数字,它不应自动将空字符串更改为 NaN。 (3认同)
  • 很抱歉复活这么旧的答案,但这曾经发生过吗?据我从 [this GitHub PR](https://github.com/pydata/pandas/pull/1522) 得知,它在没有合并的情况下就被关闭了,而且我在 pandas 版本 0.14 中没有看到请求的行为。X (2认同)

buh*_*htz 11

pandas默认情况下定义为缺失值的内容read_csv()可以在此处找到。

import pandas
default_missing = pandas._libs.parsers.STR_NA_VALUES
print(default_missing)
Run Code Online (Sandbox Code Playgroud)

输出

{'', '<NA>', 'nan', '1.#QNAN', 'NA', 'null', 'n/a', '-nan', '1.#IND', '#N/A N/A', 'N/A', 'NULL', 'NaN', '-1.#IND', '-1.#QNAN', '#NA', '#N/A', '-NaN'}
Run Code Online (Sandbox Code Playgroud)

这样您就可以选择退出。

import pandas
default_missing = pandas._libs.parsers.STR_NA_VALUES
default_missing = default_missing.remove('')
default_missing = default_missing.remove('na')

with open('test.csv', 'r') as csv_file:
    pandas.read_csv(csv_file, na_values=default_missing)
Run Code Online (Sandbox Code Playgroud)


小智 10

我们在 Pandas 中有一个简单的论点 read_csv()

用:

df = pd.read_csv('test.csv', na_filter= False)
Run Code Online (Sandbox Code Playgroud)

  • 看起来 OP _does_ 想要使用 `na_values` 来识别“nan”,但是完全关闭 `na_filter` 会失败。因此我的回答是“keep_default_na=False”。 (2认同)