143

我正在使用 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”读取为字符串“nan”,但仍将空单元格读取为 NaN。我尝试将str参数converters传入 read_csv(使用converters={'One': str})),但它仍将空单元格读取为 NaN。

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

4

5 回答 5

158

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

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

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

这个问题在中解释得更清楚

这已于 2012 年 8 月 19 日针对 Pandas 版本 0.9 修复

于 2017-05-07T14:55:36.283 回答
66

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

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

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

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

于 2012-06-12T21:33:20.550 回答
12

为此,我们在 Pandasread_csv()中有一个简单的论点:

采用:

df = pd.read_csv('test.csv', na_filter= False)
于 2019-07-05T12:59:04.643 回答
5

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

import pandas
default_missing = pandas._libs.parsers.STR_NA_VALUES
print(default_missing)

输出

{'', '<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'}

有了它,您可以选择退出。

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)
于 2021-07-14T11:49:28.823 回答
1

如果您只想保留一列的空字符串,请定义str为列转换器(dtypes将不起作用):

pd.read_csv('test.csv', converters={'column_name': str})
于 2021-11-30T16:17:39.177 回答