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。的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch 1.0 中文文档:数据类型信息

Pandas read_csv dtype 读取所有列,但很少作为字符串读取

pandas,如何合并多个相同列的csv文件

pandas,如何合并多个相同列的csv文件

转换具有 numpy 数组的列将其转换为 dtype 作为对象的 numpy 数组

如何使用pandas将csv列作为dtype列表读取?