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 循环的第一行有效,但我从单热转换中得到了垃圾。
请帮忙。
以下这些信息可能会有帮助:
- 部分对象的类型:
data[feature]
: pandas.Series
data[feature].values
: numpy.ndarray
- 你可以
reshape
一个numpy.ndarray
但不能pandas.Series,所以你需要使用.values
来得到一个numpy.ndarray
- 当您将
numpy.ndarray
分配给 data[feature]
时,会发生自动类型转换,因此 data[feature] = data[feature].values.reshape(-1, 1)
似乎没有做任何事情。
fit_transform
接受类数组(需要是二维数组,例如 pandas.DataFrame
或 numpy.ndarray
)对象作为参数,因为 sklearn.preprocessing.OneHotEncoder
被设计为 fit/transform多个特征同时输入pandas.Series
(一维数组)会报错
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
也是不错的选择
我有以下程序:
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 循环的第一行有效,但我从单热转换中得到了垃圾。
请帮忙。
以下这些信息可能会有帮助:
- 部分对象的类型:
data[feature]
:pandas.Series
data[feature].values
:numpy.ndarray
- 你可以
reshape
一个numpy.ndarray
但不能pandas.Series,所以你需要使用.values
来得到一个numpy.ndarray
- 当您将
numpy.ndarray
分配给data[feature]
时,会发生自动类型转换,因此data[feature] = data[feature].values.reshape(-1, 1)
似乎没有做任何事情。 fit_transform
接受类数组(需要是二维数组,例如pandas.DataFrame
或numpy.ndarray
)对象作为参数,因为sklearn.preprocessing.OneHotEncoder
被设计为 fit/transform多个特征同时输入pandas.Series
(一维数组)会报错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
也是不错的选择