pandas simpleimputer сохраняют типы данных - PullRequest
0 голосов
/ 12 ноября 2018

Я столкнулся с простой ошибкой с кодом ниже.

Моя цель - использовать simpleimputer для вставки пропущенных значений различных типов данных в один снимок.

Когда я пытаюсь это сделать, fit_transform, похоже, работает не так, как ожидалось. Когда аргумент dtype не используется, код работает нормально, но результирующий фрейм данных теряет информацию о типе данных. Когда я включаю список dtype в аргументы, я вижу ошибку ниже. Вы должны иметь возможность смоделировать ошибку, просто скопировав и вставив в локальный файл.

import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer

import sklearn
print(sklearn.__version__)

0.21.dev0

data = [['Alex','NJ',21,5.10],['Mary','NY',20,np.nan],['Sam',np.nan,np.nan,6.3]]
df = pd.DataFrame(data,columns=['Name','State','Age','Height'])

df.dtypes
Name       object
State      object
Age       float64
Height    float64
dtype: object                 

imp = SimpleImputer(strategy="most_frequent")

#df = pd.DataFrame(imp.fit_transform(df),columns=df.columns)   <<<<----- This works just fine
#df
#Name   State   Age Height
#0  Alex    NJ  21  5.1
#1  Mary    NY  20  5.1
#2  Sam NJ  20  6.3
#df.dtypes
#Name      object
#State     object
#Age       object
#Height    object
#dtype: object

Вышеприведенное утверждение не выполнено - с ошибкой, указанной ниже (я пытаюсь сохранить dtypes во время процесса вменения)

df = pd.DataFrame(imp.fit_transform(df),columns=df.columns,dtype=df.dtypes)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-23-e9780979921f> in <module>()
      7 
      8 imp = SimpleImputer(strategy="most_frequent")
----> 9 df = pd.DataFrame(imp.fit_transform(df),columns=df.columns,dtype=df.dtypes)

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\frame.py in __init__(self, data, index, columns, dtype, copy)
    337             data = {}
    338         if dtype is not None:
--> 339             dtype = self._validate_dtype(dtype)
    340 
    341         if isinstance(data, DataFrame):

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\generic.py in _validate_dtype(self, dtype)
    166 
    167         if dtype is not None:
--> 168             dtype = pandas_dtype(dtype)
    169 
    170             # a compound dtype

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\dtypes\common.py in pandas_dtype(dtype)
   2020     # which we safeguard against by catching them earlier and returning
   2021     # np.dtype(valid_dtype) before this condition is evaluated.
-> 2022     if dtype in [object, np.object_, 'object', 'O']:
   2023         return npdtype
   2024     elif npdtype.kind == 'O':

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
   1574         raise ValueError("The truth value of a {0} is ambiguous. "
   1575                          "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
-> 1576                          .format(self.__class__.__name__))
   1577 
   1578     __bool__ = __nonzero__

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

1 Ответ

0 голосов
/ 12 ноября 2018

Если вы хотите сохранить dtype, я рекомендую использовать pandas, чтобы найти режим, а затем вызвать fillna:

df = df.fillna(df.agg(lambda x: pd.Series.mode(x)[0], axis=0))
print(df)
   Name State   Age  Height
0  Alex    NJ  21.0     5.1
1  Mary    NY  20.0     5.1
2   Sam    NJ  20.0     6.3

print(df.dtypes)
Name       object
State      object
Age       float64
Height    float64
dtype: object

Либо используйте astype и передайте словарь:

df = pd.DataFrame(
     imp.fit_transform(df), columns=df.columns
).astype(df.dtypes.to_dict())

print(df)
   Name State   Age  Height
0  Alex    NJ  21.0     5.1
1  Mary    NY  20.0     5.1
2   Sam    NJ  20.0     6.3

print(df.dtypes)
Name       object
State      object
Age       float64
Height    float64
dtype: object

Явный astype вызов необходим, потому что, согласно документации, только один dtype может быть передан конструктору pd.DataFrame.

?pd.DataFrame
...
dtype : dtype, default None
 |      Data type to force. Only a single dtype is allowed.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...