1.0作为boolean dtype在pd.read_csv()中引起ValueError。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.0作为boolean dtype在pd.read_csv()中引起ValueError。相关的知识,希望对你有一定的参考价值。
我有一个类似下面的CSV文件,我想用pandas读取 "boolean_column "作为一个可空的布尔类型。
boolean_column, string_column
1.0, a
0.0, b
,c
当我使用 pd.read_csv()
而不分配dtypes,就不会出现错误。
import io
import pandas as pd
example_csv = """
boolean_column, string_column
1.0, a
0.0, b
,c"""
csv = io.StringIO(example_csv)
df = pd.read_csv(csv)
df.info()
>>> <class 'pandas.core.frame.DataFrame'>
RangeIndex: 3 entries, 0 to 2
Data columns (total 2 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 boolean_column 2 non-null float64
1 string_column 3 non-null object
dtypes: float64(1), object(1)
memory usage: 176.0+ bytes
但是,我希望 "boolean_column "有一个可空的boolean dtype,而不是float64。因此,我在读取数据时分配了一个dtype。
csv = io.StringIO(example_csv)
df = pd.read_csv(csv, dtype={"boolean_column": "boolean"})
>>> ValueError: 1.0 cannot be cast to bool
我认为立即赋值正确的dtype,而不是事后再赋值float64,这样更优雅。我有什么不明白的?这应该能用,对吧?
至少这个是可以的。
pd.Series([None, 1.0, 0.0]).astype("boolean")
>>> 0 <NA>
1 True
2 False
dtype: boolean
答案
我不熟悉pandas的一个开箱即用的功能。read_csv
解决了这个问题。不过,你可以自己建立一个转换器。
def foo(x):
if x == "1.0":
return True
elif x == "":
return np.NaN
else:
return False
pd.read_csv(StringIO(example_csv), converters = {"boolean_column": foo})
结果是:
boolean_column string_column
0 True a
1 False b
2 NaN c
以上是关于1.0作为boolean dtype在pd.read_csv()中引起ValueError。的主要内容,如果未能解决你的问题,请参考以下文章
Pandas read_csv dtype 读取所有列,但很少作为字符串读取