【发布时间】:2020-03-24 19:09:23
【问题描述】:
这与Get pandas.read_csv to read empty values as empty string instead of nan完全相反
鉴于以下 CSV 文件:
col,val
"hi
there",1
,2
\f\,3
"",4
"""hi""",5
我希望它被读作:
col val
0 hi\nthere 1
1 NaN 2
2 \f\ 3
3 4
4 "hi" 5
即读取空字段(val 2)为NaN,同时保持空字符串(val 4)为空字符串。
目前pd.read_csv 将 val 2 和 val 4 都转换为 NaN,或者如果我使用 na_filter=False 两者都保留为空字符串。
我假设这两种表示在 CSV 中意味着不同的东西(空字段与空字符串),所以我假设 pandas 也应该能够区分这一点。
有没有办法让pandas区分这两种情况?还是我的假设是错误的,这两种表示实际上是相同的? (如果是第二种情况,请指出 CSV 标准)
更多信息,我通过将 BigQuery 表(具有预期含义,val 2 为空,val 4 为空字符串)导出到 CSV 来获得 CSV。我想拿回完全相同的桌子。 所以这个例子不仅仅是一个人为的例子,而是 BigQuery 在导出到 CSV 时实际使用的。
编辑:进一步搜索显示 Github issue 4 years ago 讨论了类似的观点(例如,参见 this comment),其中一位评论者提到存在一些强制(我不确定他们指的是什么,但我将其理解为空字段和空字符串之间的强制)。这还在发生吗?
【问题讨论】:
-
如果你使用 csv 模块,并且打印出每一行,这两者有区别吗?这会告诉你 pandas 是否有机会以不同的方式阅读它们。
-
也许这相当于我的问题,因为熊猫在后台使用 csv 模块:“如何让 csv 模块以不同的方式读取空字段和空字符串?” (注意,我还没试过)
-
你用的是什么熊猫版本?这在 0.25 上按预期工作。
-
我在 Ubuntu 上使用 0.25.1,Python 3。你能澄清一下你所说的按预期工作是什么意思吗?就像我希望它在我的问题中一样工作?
-
您的问题有一部分不是标准的,即您想混合列数据类型。
NaN是一个浮点值;所以空字符串不应该是NaN。我完全理解这种行为的许多用例——另一方面,最好以更明确的方式实现这一点(并且库更有可能支持):有另一列告诉你是否不是另一列为空。无论数据类型如何,这都会起作用,并且避免必须使用域的有效值(空字符串)作为 null 的指示符。