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

Posted

技术标签:

【中文标题】获取 pandas.read_csv 以将空值读取为空字符串而不是 nan【英文标题】:Get pandas.read_csv to read empty values as empty string instead of nan 【发布时间】:2012-06-07 16:24:11 【问题描述】:

我正在使用 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。我尝试在 converters 参数中将 str 传递给 read_csv(使用 converters='One': str)),但它仍然将空单元格读取为 NaN。

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

【问题讨论】:

注意更简单的答案,请使用下面更新的选项keep_default_na 【参考方案1】:

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

pd.read_csv('test.csv', converters='column_name': str)

【讨论】:

【参考方案2】:

为此,我们在 Pandas read_csv() 中有一个简单的参数:

用途:

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

【讨论】:

看起来 OP 确实想使用 na_values 来识别“nan”,但完全关闭 na_filter 会失败。因此我的回答是keep_default_na=False 小心,na_filter=False 可以将您的列类型更改为对象【参考方案3】:

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)

【讨论】:

一个小错字,将a_values替换为na_values【参考方案4】:

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

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

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

这个问题在

中有更清楚的解释 More consistent na_values handling in read_csv · Issue #1657 · pandas-dev/pandas

这是在 2012 年 8 月 19 日针对 Pandas 0.9 版修复的

BUG: more consistent na_values #1657 · pandas-dev/pandas@d9abf68

【讨论】:

这显然是最好的答案,它应该被指定为第一个解决方案。谢谢@nealmcb 我希望这是默认值,我不得不谷歌搜索这个答案的次数......【参考方案5】:

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

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

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

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

【讨论】:

Documentation for DataFrame.fillna. 试试result.fillna('', inplace=True)。否则,它会创建数据帧的副本。 很抱歉复活了这么老的答案,但这曾经发生过吗?据我从this GitHub PR 可以看出,它在没有被合并的情况下被关闭,而且我在熊猫版本 0.14.x 中没有看到请求的行为 Documentation for 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) @delgadom 感谢您将我带到keep_default_na。但请注意,他也不希望“nan”被视为默认值。我添加了更完整的解释作为新答案。 又遇到了这个问题。修复很简单(最好的答案如下所示keep_default_na=False),但熊猫对此的默认行为是 IMO 不好。如果出于某种原因,pandas read_csv 推断出一列不是数字,它不应该自动将空字符串更改为 NaN。

以上是关于获取 pandas.read_csv 以将空值读取为空字符串而不是 nan的主要内容,如果未能解决你的问题,请参考以下文章

Pandas read_csv 用字符串“nan”填充空值,而不是解析日期

Hive/Bigsql Pandas 将浮点数转换为整数,使用 pyarrow 将空值转换为镶木地板文件

通过服务器功能将空值返回给Apps Script webapp以获取某个电子表格

pandas read_csv读取大文件的Memory error问题

如何使用 pandas.read_csv() 将索引数据读取为字符串?

使用 pandas.read_csv 从 URL 读取压缩的 CSV 文件时出错