获取 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 forDataFrame.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问题