1.0 как логическое значение dtype вызывает ValueError в pd.read_csv () - PullRequest
0 голосов
/ 17 июня 2020

У меня есть CSV-файл, похожий на следующий, в котором я хочу читать "boolean_column" как логический тип dtype, допускающий значение NULL, с pandas.

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" имел логический dtype, допускающий значение NULL, а не 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

1 Ответ

1 голос
/ 17 июня 2020

Я не знаком с готовой функцией 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...