Imputer на некоторых столбцах в Dataframe - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь использовать Imputer в отдельном столбце с именем age, чтобы заменить отсутствующие значения. Но я получаю сообщение об ошибке «Ожидаемый 2D-массив, вместо него получен 1D-массив:»

Ниже приведен мой код

import pandas as pd
import numpy as np
from sklearn.preprocessing import Imputer

dataset = pd.read_csv("titanic_train.csv")

dataset.drop('Cabin',axis = 1,inplace = True)
x = dataset.drop('Survived',axis = 1)
y = dataset['Survived']

imputer = Imputer(missing_values ="nan",strategy = "mean",axis = 1)
imputer=imputer.fit(x['Age'])
x['Age']=imputer.transform(x['Age'])

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Когда вы в состоянии трансформироваться, используйте форму (-1,1).Поскольку метод ожидает двухмерный массив в качестве входных данных, но вы предоставляете одномерный массив.

Пример: x ['Age'] = imputer.transform (x ['Age']. Reshape (-1,1))

0 голосов
/ 18 сентября 2018

Хотя @thesilkworkm побеждает меня в тисках, полезно знать, почему именно ваш собственный код не работает.

Итак, кроме проблемы с изменением формы, в вашем коде есть еще две ошибки; во-первых, вы ошибочно запрашиваете axis=1 в вашем импутере, тогда как вы должны запрашивать axis=0 (что является значением по умолчанию, и поэтому оно работает, когда полностью опущено, как в ответе @ thesilkworkm'a); из документов :

ось : целое число, необязательно (по умолчанию = 0)

Ось, по которой следует вменять.

  • Если ось = 0, то вменять по столбцам.
  • Если ось = 1, то вменять по строкам.

Вторая ошибка - ваш missing_values аргумент, который должен быть 'NaN', а не 'nan'; из документов снова:

отсутствующие значения : целое число или «NaN», необязательно (по умолчанию = «NaN»)

Заполнитель для пропущенных значений. Все вхождения пропущенных_значений будут вменяться. Для пропущенных значений, закодированных как np.nan, используйте строковое значение «NaN».

Итак, просто для того, чтобы предложить альтернативное, но эквивалентное решение (помимо того, которое уже предоставлено @thesilkworm), вы также можете разместить и преобразовать в одну строку:

imp = Imputer(missing_values ="NaN",strategy = "mean",axis = 0)
x['Age'] = imp.fit_transform(x['Age'].reshape(-1,1))
0 голосов
/ 18 сентября 2018

Imputer ожидает двухмерный массив в качестве входных данных, даже если одно из этих измерений имеет длину 1. Это может быть достигнуто с помощью np.reshape:

imputer = Imputer(missing_values='NaN', strategy='mean')
imputer.fit(x['Age'].values.reshape(-1, 1))
x['Age'] = imputer.transform(x['Age'].values.reshape(-1, 1))

Тем не менее, если вы не делаете ничего более сложного, чем заполнение пропущенных значений с помощью среднего, вам может оказаться проще вообще пропустить Imputer и просто использовать вместо этого панд fillna:

x['Age'].fillna(x['Age'].mean(), inplace=True)
...