【问题标题】:Python One Hot Encoder: 'PandasArray' object has no attribute 'reshape'Python One 热编码器:“PandasArray”对象没有“重塑”属性
【发布时间】:2020-06-16 09:36:35
【问题描述】:

我有以下程序:

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),但这些都不起作用。我发现尝试 .values 似乎在 for 循环的第一行中起作用,但是我从一次性转换中得到了垃圾。

请帮忙。

【问题讨论】:

    标签: python pandas scikit-learn one-hot-encoding


    【解决方案1】:

    以下信息可能会有所帮助:

    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.DataFrame 或numpy.ndarray)对象作为参数,因为sklearn.preprocessing.OneHotEncoder 旨在同时拟合/转换多个特征,输入pandas.Series(一维数组)会导致错误。
    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)
    
    

    我推荐这样编码:

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

    【讨论】:

    • 感谢您的好评!只是一个简单的问题,你为什么使用 .toarray() 而不是 .values? .values 不也将数据转换为 numpy 数组吗?我不知道我会更喜欢哪一个。
    • fit_transform会返回一个sparse matrix,它没有方法:values,所以我们需要使用scipy.sparse.csr_matrix.toarray来得到一个密集的ndarray。
    猜你喜欢
    • 2021-04-14
    • 1970-01-01
    • 2018-06-06
    • 2019-05-12
    • 2018-06-20
    • 2021-04-08
    • 2016-02-14
    • 2016-10-10
    • 2016-05-22
    相关资源
    最近更新 更多