Python Один горячий кодировщик: у объекта «PandasArray» нет атрибута «изменить форму» - PullRequest
0 голосов
/ 04 марта 2020

У меня есть следующая программа:

cat_feats = ['x', 'y', 'z', 'a', 'b',
                'c', 'd', 'e']

onehot_encoder = OneHotEncoder(categories='auto')
# convert each categorical feature from integer
# to one-hot
for feature in cat_feats:
    data[feature] = data[feature].array.reshape(len(data[feature]), 1)
    data[feature] = onehot_encoder.fit_transform(data[feature])

У меня проблемы с этим. Я получаю:

'PandasArray' object has no attribute 'reshape'

Вывод data.head () перед использованием кодера выглядит следующим образом:

 0          2          1               4           6             3     2       1              37
 2          1          7               2          10             0     4       1              37
 3          2         15               2           6             0     2       1              37
 5          2          0               4           7             1     4       1              37
 7          4         14               2           9             0     4       1              37

Этот вывод имеет тип DataFrame и содержит только целые числа, которые я пытаюсь конвертировать в одну горячую. Я пробовал .array, .values, .array.reshape (-1, 1), но ничего из этого не работает. Я обнаружил, что попытка .values, похоже, сработала в первой строке для l oop, но я получил мусор из-за конвертации в одно касание.

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 04 марта 2020

Может пригодиться следующая информация:

  1. Тип некоторых объектов:
    • data[feature]: pandas.Series
    • data[feature].values: numpy.ndarray
  2. Вы можете reshape a numpy.ndarray, но не pandas .Series, поэтому вам нужно использовать .values, чтобы получить numpy.ndarray
  3. Когда вы присваиваете numpy.ndarray для data[feature], происходит автоматическое преобразование типа c, поэтому data[feature] = data[feature].values.reshape(-1, 1), похоже, ничего не делает.
  4. fit_transform принимает массив ( Должен быть двумерным массивом, например, pandas.DataFrame или numpy.ndarray) объектом в качестве аргумента, поскольку sklearn.preprocessing.OneHotEncoder предназначен для одновременного размещения / преобразования нескольких объектов, ввод pandas.Series (массив 1D) вызовет ошибку.
  5. fit_transform вернет разреженную матрицу (или двумерный массив), присвоение ей pandas.Series может вызвать аварию.

( Не рекомендуется ) Если вы настаиваете на обработке одной функции за другой:

for feature in categorical_feats:
    encoder = OneHotEncoder()
    tmp_ohe_data = pd.DataFrame(
        encoder.fit_transform(data[feature].values.reshape(-1, 1)).toarray(),
        columns=encoder.get_feature_names(),
    )
    data = pd.concat([tmp_ohe_data, data], axis=1).drop([feature], axis=1)

I Рекомендуется делать кодировку следующим образом:

encoder = OneHotEncoder()

ohe_data = pd.DataFrame(
    encoder.fit_transform(data[categorical_feats]).toarray(),
    columns=encoder.get_feature_names(),
)
res = pd.concat([ohe_data, data], axis=1).drop(categorical_feats, axis=1)

pandas.get_dummies также является хорошим выбором.

...