Join one dataset and the result of OneHotEncoder in Pandas
让我们从这个例子中考虑房价的数据集。
我将整个数据集存储在
1 | housing.shape |
(20640, 10)
我也做过一维的OneHotEncoder编码并得到
1 | housing_cat_1hot.toarray().shape |
(20640, 5)
我的目标是加入两个变量并将所有内容存储在一个数据集中。
我已经尝试了Join with index教程,但问题是第二个矩阵没有任何索引。
如何在
1 2 3 | >>> left=housing >>> right=housing_cat_1hot.toarray() >>> result = left.join(right) |
Traceback (most recent call last): File"", line 1, in
result = left.join(right) File"/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pandas/core/frame.py",
line 5293, in join
rsuffix=rsuffix, sort=sort) File"/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pandas/core/frame.py",
line 5323, in _join_compat
can_concat = all(df.index.is_unique for df in frames) File"/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pandas/core/frame.py",
line 5323, in
can_concat = all(df.index.is_unique for df in frames) AttributeError: 'numpy.ndarray' object has no attribute 'index'
如果你想加入两个数组(假设housing_cat_1hot和housing都是数组),你可以使用
1 | housing = np.hstack((housing, housing_cat_1hot)) |
虽然OneHotEncode变量的最佳方法是在数组中选择该变量并进行编码。 它为您节省了以后加入两者的麻烦
假设您希望在数组中编码的变量的索引是1,
1 2 3 4 5 6 | from sklearn.preprocessing import LabelEncoder, OneHotEncoder le = LabelEncoder() X[:, 1] = le.fit_transform(X[:, 1]) onehotencoder = OneHotEncoder(categorical_features = [1]) X = onehotencoder.fit_transform(X).toarray() |
那么,取决于你如何创建一个热矢量。
但如果它的排序方式与原始DataFrame相同,并且本身就是DataFrame,则可以在加入之前添加相同的索引:
1 | housing_cat_1hot.index = range(len(housing_cat_1hot)) |
如果它不是DataFrame,请将其转换为一个。
这很简单,只要两个对象的排序方式相同即可
编辑:如果它不是DataFrame,那么:
housing_cat_1hot = pd.DataFrame(housing_cat_1hot)
已经为您创建了合适的索引
感谢@ Elez-Shenhar回答我得到以下工作代码:
1 2 3 4 | OneHot=housing_cat_1hot.toarray() OneHot= pd.DataFrame(OneHot) result = housing.join(OneHot) result.shape |
(20640, 15)