让 pandas.read_csv 将空值读取为空字符串而不是 nan
- 2025-03-04 08:27:00
- admin 原创
- 84
问题描述:
我正在使用 pandas 库读取一些 CSV 数据。在我的数据中,某些列包含字符串。字符串"nan"
是一个可能的值,空字符串也是如此。我设法让 pandas 将“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 吗?
解决方案 1:
在阅读其他答案和评论后,我仍然感到困惑。但现在答案似乎更简单了,所以请看这里。
自 Pandas 版本 0.9(从 2012 年起)以来,您可以通过简单设置来读取将空单元格解释为空字符串的 csv keep_default_na=False
:
pd.read_csv('test.csv', keep_default_na=False)
这个问题在
read_csv 中更一致的 na_values 处理 · 问题 #1657 · pandas-dev/pandas
该问题已于 2012 年 8 月 19 日在 Pandas 0.9 版中修复
BUG:更一致的 na_values #1657 · pandas-dev/pandas@d9abf68
解决方案 2:
我添加了一张票,以便在此处添加某种选项:
https://github.com/pydata/pandas/issues/1450
与此同时,result.fillna('')
你应该做你想做的事
编辑:在开发版本(最终版本为 0.8.0)中,如果指定一个空列表na_values
,则空字符串将在结果中保留为空字符串
解决方案 3:
read_csv()
对此,我们在 Pandas 中有一个简单的论据:
使用:
df = pd.read_csv('test.csv', na_filter= False)
解决方案 4:
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)
解决方案 5:
如果您只想保留一列的空字符串,请定义str
为列转换器(dtypes
不起作用)。使用 pandas 1.1.5 检查:
pd.read_csv('test.csv', converters={'One': str, 'Three': str})
解决方案 6:
pd.read_csv( sourceObj, dtype='string')
不需要额外的参数。
每列类型都是python原始字符串,空值变为空字符串''。
版本:Pandas v1.5
扫码咨询,免费领取项目管理大礼包!