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


100

我正在使用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

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

我意识到我可以在读取后使用fillna填充值,但是真的没有办法告诉熊猫特定CSV列中的空单元格应被读取为空字符串而不是NaN吗?


请注意,使用keep_default_na下面的更新选项来回答更简单的问题。
nealmcb

Answers:


57

我添加了票证以在此处添加某种选项:

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

同时,result.fillna('')应该做你想做的

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


12
的文档DataFrame.fillna尝试result.fillna('', inplace=True)。否则,它将创建数据框的副本。
Sergey Orshanskiy 2014年

1
很抱歉复活这么旧的答案,但是这曾经发生过吗?据我从这个GitHub PR所知道的,它是关闭的,从未被合并过,而且我在熊猫0.14.x版本中没有看到所请求的行为
drammock 2015年

10
read_csv的文档现在提供na_values(按列索引的列表或字典)和keep_default_na(布尔)。该keep_default_na值指示是否应替换或附加熊猫的默认NA值。OP的代码当前仅因缺少此标志而无法运行。在此示例中,您可以使用pandas.read_csv('test.csv',na_values=['nan'], keep_default_na=False)
Michael Delgado

@delgadom感谢您带领我参加keep_default_na。但请注意,他也不想将“ nan”视为默认值。我添加了更完整的解释作为新答案。
nealmcb

再次遇到这个。修复很容易(最好的答案如下keep_default_na=False),但是熊猫的默认行为是IMO不好的。如果由于某种原因pandas read_csv推断列不是数字,则不应自动将空字符串更改为NaN。
pietroppeter

113

阅读其他答案和评论后,我仍然感到困惑。但是,现在的答案似乎更简单,因此您可以开始操作。

从Pandas 0.9版(自2012年起)开始,您只需设置keep_default_na=False以下内容,即可读取解释为空字符串的空单元格的csv :

pd.read_csv('test.csv', keep_default_na=False)

此问题在以下内容中有更清楚的说明

该问题已于2012年8月19日在Pandas 0.9版中修复


5
显然,这是最佳答案,应将其指定为第一个解决方案。感谢@nealmcb
dzof31 '19

3
为什么这不是更受欢迎的答案?从昨天开始一直在寻找这种解决方案。谢谢!
阿尼什

7

我们在Pandas read_csv中有一个简单的参数:

使用:

df = pd.read_csv('test.csv', na_filter= False)

熊猫的文档清楚地解释了上述论点是如何工作的。

链接


看起来OP确实想使用它na_values来识别“ nan”,但是na_filter完全关闭将无法解决该问题。因此,我的回答是keep_default_na=False
nealmcb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.