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

Get pandas.read_csv to read empty values as empty string instead of nan

提问人:BrenBarn 提问时间:6/3/2012 最后编辑:piRSquaredBrenBarn 更新时间:3/3/2023 访问量:209611

问:

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

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

python csv 熊猫

评论

3赞 nealmcb 5/25/2020
请注意更简单的答案,请使用下面更新的选项进行回答。keep_default_na
0赞 dank8 3/3/2023
pd.read_csv( sourceObj, dtype='string' ),则不需要其他参数。Pandas 将强制转换所有行字符串,空值将设置为空字符串 ''

答:

71赞 Wes McKinney 6/13/2012 #1

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

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

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

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

评论

15赞 Sergey Orshanskiy 9/6/2014
DataFrame.fillna 的文档。尝试。否则,它将创建数据帧的副本。result.fillna('', inplace=True)
2赞 drammock 9/11/2015
很抱歉复活这样一个古老的答案,但这曾经发生过吗?据我所知,从这个 GitHub PR 中可以看出,它已被关闭而从未被合并,并且在 pandas 版本 0.14.x 中我没有看到请求的行为
11赞 Michael Delgado 10/1/2015
read_csv 的文档现在提供 (list or dict indexed by columns) 和 (bool)。该值指示是否应替换或追加 pandas 的默认 NA 值。OP 的代码目前不起作用,只是因为它缺少此标志。对于此示例,您可以使用 .na_valueskeep_default_nakeep_default_napandas.read_csv('test.csv',na_values=['nan'], keep_default_na=False)
0赞 nealmcb 5/7/2017
@delgadom 谢谢你带领我.但请注意,他也不希望将“nan”视为默认值。我添加了一个更完整的解释作为新的答案。keep_default_na
3赞 pietroppeter 8/27/2020
又遇到了这个问题。修复很容易(最好的答案如下),但熊猫的默认行为是 IMO 不好的。如果由于某种原因 pandas read_csv推断出一列不是数字,它不应该自动将空字符串更改为 NaN。keep_default_na=False
218赞 nealmcb 5/7/2017 #2

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

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

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

这个问题在

2012 年 8 月 19 日,Pandas 版本 0.9 在

评论

16赞 dzof31 7/26/2019
这显然是最好的答案,它应该被指定为第一个解决方案。谢谢@nealmcb
6赞 David Waterworth 8/17/2021
我希望这是默认设置,我不得不在谷歌上搜索这个答案的次数......
0赞 Radek Svoboda 10/25/2023
如果我在另一列中有“nan”,我想将其加载为 NaN,这将不起作用。问题是关于仅在读取字符串列时将“”转换为“”。
16赞 Sundeep 7/5/2019 #3

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

用:

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

评论

3赞 nealmcb 10/18/2019
看起来 OP 确实想用来识别“nan”,但完全关闭会打败它。因此,我的答案是.na_valuesna_filterkeep_default_na=False
1赞 Ricardo Mutti 9/8/2021
请注意,可以将列类型更改为对象na_filter=False
0赞 wiseass 2/4/2023
Per na_filter=False “将列更改为类型 Object”:在我看来,Pandas 默认设置是将列设置为对象,如果列的其他数据元素是字符串而不是明显是数字的东西(例如,列“一”和“三”在问题中。
11赞 buhtz 7/14/2021 #4

默认情况下定义为缺失值的内容可以在这里找到。pandasread_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)

评论

1赞 Bruno Adelé 8/26/2021
轻微的拼写错误,替换为a_valuesna_values
3赞 ronkov 12/1/2021 #5

如果只想保留一列的空字符串,请定义为列转换器( 将不起作用)。已使用 pandas 1.1.5 进行检查:strdtypes

pd.read_csv('test.csv', converters={'One': str, 'Three': str})

评论

0赞 mike01010 11/23/2023
这似乎行不通。“str”对象不可调用
0赞 ronkov 11/27/2023
@mike01010我已经检查过这是否适用于示例数据和 pandas 版本 1.1.5。也许其他版本不是这样
1赞 dank8 3/3/2023 #6

pd.read_csv( sourceObj, dtype='string')

无需其他参数。

每个列类型都是 python 原始字符串,空值变为空字符串 ''。

版本: Pandas v1.5