让我们从this example开始考虑房价的数据集。
我将整个数据集存储在housing
变量中:
housing.shape
(20640,10)
我也做过一维的OneHotEncoder编码并获得housing_cat_1hot
,所以
housing_cat_1hot.toarray().shape
(20640,5)
我的目标是加入两个变量并将所有内容存储在一个数据集中。
我尝试了Join with index tutorial,但问题是第二个矩阵没有任何索引。
如何在housing
和housing_cat_1hot
之间进行联接?
>>> left=housing
>>> right=housing_cat_1hot.toarray()
>>> result = left.join(right)
Traceback(最近一次调用最后一次):文件“”,第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”, 第5293行,在加入 rsuffix = rsuffix,sort = sort)文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pandas/core/frame.py”, 第5323行,在_join_compat中 can_concat = all(df.index.is_unique用于帧中的df)文件“/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pandas/core/frame py”为, 第5323行 can_concat = all(df.index.is_unique用于帧中的df)AttributeError:'numpy.ndarray'对象没有属性'index'
答案 0 :(得分:1)
那么,取决于你是如何创建单热矢量的。 但是,如果它的排序方式与原始DataFrame相同,并且本身就是DataFrame,则可以在加入之前添加相同的索引:
housing_cat_1hot.index = range(len(housing_cat_1hot))
如果它不是DataFrame,请将其转换为一个。 这很简单,只要两个对象都排序相同
编辑:如果它不是DataFrame,那么: housing_cat_1hot = pd.DataFrame(housing_cat_1hot)
已为您创建适当的索引
答案 1 :(得分:1)
如果你想加入两个数组(假设housing_cat_1hot和housing都是数组),你可以使用
housing = np.hstack((housing, housing_cat_1hot))
虽然OneHotEncode变量的最佳方法是在数组中选择该变量并进行编码。它为您节省了加入后两个
的麻烦假设您希望在数组中编码的变量的索引是1,
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()
答案 2 :(得分:0)
感谢@ Elez-Shenhar回答我得到以下工作代码:
OneHot=housing_cat_1hot.toarray()
OneHot= pd.DataFrame(OneHot)
result = housing.join(OneHot)
result.shape
(20640,15)