Правильный способ передачи столбца импуттеру с помощью меток? - PullRequest
0 голосов
/ 18 октября 2018

У меня есть следующий рабочий код:

imputer = Imputer(missing_values = 'NaN', strategy='mean', axis = 0)
imputer = imputer.fit(X_train[['Age']])
X_train['Age'] = imputer.transform(X_train[['Age']])

И это выдает мне следующее предупреждение:

Значение пытается быть установлено на копию фрагмента изDataFrame.Попробуйте использовать .loc [row_indexer, col_indexer] = значение вместо

Когда я использую следующую строку, я все еще получаю то же предупреждение;почему это так:

X_train['Age'] = imputer.transform(X_train[['Age']])

Если я пытаюсь применить ко всем одинаковую логику:

imputer = Imputer(missing_values = 'NaN', strategy='mean', axis = 0)
imputer = imputer.fit(X_train.loc[:,'Age'])
X_train.loc[:,'Age'] = imputer.transform(X_train.loc[:, 'Age'])

Я получаю следующее сообщение, и imputer не работает:

Измените ваши данные, используя array.reshape (-1, 1), если ваши данные имеют одну функцию, или array.reshape (1, -1), если они содержат один образец.

Пожалуйста, кто-нибудь может объяснить мне, каким должен быть правильный способ передачи столбца в импуттер с использованием меток?

Я не понимаю четко разницу между использованием [['Age']] и .loc[:,'Age'], этопохоже, они имеют те же данные, но в другой форме.

Ответы [ 3 ]

0 голосов
/ 28 июня 2019

Использовать метод fit_transform

imputer = Imputer(missing_values=0, strategy="mean", axis=0)
X_train[['Age']] = imputer.fit_transform(X_train[['Age']])
0 голосов
/ 28 июня 2019

Я бы порекомендовал следующий метод

X.loc[:,'Age'] = imputer.fit_transform(X[['Age']])

Рабочий пример:

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

X = pd.DataFrame({'Age': [12,13,'NaN', 23,31,12,43,32,42,]})
imputer = SimpleImputer(strategy='mean')
X.loc[:,'Age'] = imputer.fit_transform(X[['Age']])

#
    Age
0   12.0
1   13.0
2   26.0
3   23.0
4   31.0
5   12.0
6   43.0
7   32.0
8   42.0

imputer ожидал бы двумерную {массивоподобную, разреженную матрицу}, форму (n_samples,n_features) или DataFrame.когда вы просто используете X['Age'], он вернет объект pd.Series.Вместо этого, когда вы используете X[['Age']], Dataframe будет возвращен.

0 голосов
/ 28 июня 2019

Согласно последней полученной вами ошибке, при выборе столбца данных, например imputer = imputer.fit(X_train.loc[:, 'Age']), вы фактически передаете Serie в Imputer , который является одномерным.

type(X_train['Age'])
pandas.core.series.Series

Однако метод fit() ожидает, что вы передадите ему двумерный массив.Вместо этого вы можете использовать столбец Age index таким способом, который возвращает Dataframe (т. Е. Двумерный):

type(X_train.iloc[:,2:3])
pandas.core.frame.DataFrame

При этом вы не получите ошибку измерения.Я проверил это для вашей цели, и это сработало.

...