2012-06-03 63 views
31

我使用熊猫库来读取某些CSV数据。在我的数据中,某些列包含字符串。字符串"nan"是一个可能的值,因为它是一个空字符串。我设法让熊猫读取“nan”作为字符串,但我无法弄清楚如何让它读取不为NaN的空值。这里的样本数据,并输出获取pandas.read_csv读取空值作为空字符串而不是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?

回答

27

我加票加排序这里的一些选项:

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

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

编辑:在开发版本(为0.8 .0 final)如果您指定一个空列表na_values,空字符串将保留空字符串结果

+6

[DataFrame.fillna的文档。](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.fillna.html)尝试'result.fillna('',inplace = True )'。否则它会创建数据帧的副本。 – osa

+1

对于这样一个旧的答案感到遗憾,但这是否曾经发生过?据我所知,[这个GitHub PR](https:// github。com/pydata/pandas/pull/1522)它已经关闭而没有被合并过,我在pandas版本0.14.x – drammock

+7

[Documentation](http://pandas.pydata.org/pandas- docs/stable/generated/pandas.read_csv.html)现在提供'na_values'(按列索引的列表或词典)和'keep_default_na'(布尔)。 'keep_default_na'值指示是否应该替换或追加熊猫的默认NA值。 OP的代码目前不起作用,仅仅是因为它缺少了这个标志。对于这个例子,你可以使用'pandas.read_csv('test.csv',na_values = ['nan'],keep_default_na = False)'。 – delgadom

-1

使用fillna方法,但使用两次'nan'= 'nan','NaN'=“”。这会让逗号排队。 如果NAN werent那么列不会排队。记住:nan不等于NaN。

+1

我不明白你的答案。正如我所说,阅读后我不想使用fillna或任何其他方法调用。我问是否有办法在CSV阅读操作过程中进行转换。 – BrenBarn

+0

Downvote,真的?!你的问题不清楚。问:在CSV阅读操作过程中进行转换A:不,我之前问过同一个问题,因此将其删除。你必须分两步处理。 CSV模块也是如此,分两步。 – Merlin

12

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

由于熊猫0.9版(自2012年),可以通过简单的设置keep_default_na=False读取解释为空字符串空单元格的CSV:

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

这个问题在

这是修正于2012年8月19日的Pandas版本0.9在