Python 一个热编码器:'PandasArray' 对象没有属性 'reshape'

Python One Hot Encoder: 'PandasArray' object has no attribute 'reshape'

我有以下程序:

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 类型,仅包含我正在尝试将其转换为 one-hot 的整数。我已经尝试过 .array、.values、.array.reshape(-1, 1),但其中 none 有效。我发现尝试 .values 似乎在 for 循环的第一行有效,但我从单热转换中得到了垃圾。

请帮忙。

以下这些信息可能会有帮助:

  1. 部分对象的类型:
    • data[feature]: pandas.Series
    • data[feature].values: numpy.ndarray
  2. 你可以reshape一个numpy.ndarray但不能pandas.Series,所以你需要使用.values来得到一个numpy.ndarray
  3. 当您将 numpy.ndarray 分配给 data[feature] 时,会发生自动类型转换,因此 data[feature] = data[feature].values.reshape(-1, 1) 似乎没有做任何事情。
  4. fit_transform 接受类数组(需要是二维数组,例如 pandas.DataFramenumpy.ndarray)对象作为参数,因为 sklearn.preprocessing.OneHotEncoder 被设计为 fit/transform多个特征同时输入pandas.Series(一维数组)会报错
  5. fit_transform将return稀疏矩阵(或二维数组)赋值给一个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)

推荐这样编码:

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也是不错的选择