提问者:小点点

将一个数据集和OneHotEncoder的结果连接到Pandas中


让我们从这个例子中考虑房价的数据集。

我将整个数据集存储在外壳变量中:

housing.shape

(20640, 10)

我还做了一维的OneHotEncoder编码,得到了外壳\u cat\u 1hot,所以

housing_cat_1hot.toarray().shape

(20640, 5)

我的目标是将两个变量连接起来,并将所有内容存储在一个数据集中。

我尝试过使用索引联接教程,但问题是第二个矩阵没有任何索引。如何在外壳外壳_cat_1hot之间进行连接?

>>> left=housing
>>> right=housing_cat_1hot.toarray()
>>> result = left.join(right)

回溯(最近一次调用):文件“”,第1行,结果=左。join(右)文件“/usr/local/ceral/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/pandas/core/frame.py”,第5293行,在join-rsuffix=rsuffix,sort=sort)文件“/usr/local/ceral/python3/3.6.3/Frameworks/python3.framework/Versions/3.6/lib/python3.6/pandas/core/frame.py”第5323行中,在can_concat=all(df.index.is_对于框架中的df是唯一的)文件/usr/local/ceral/python3/3.6.3/Frameworks/Python.framework/framework/framework/framework/framework/framework/Versions/3.6/lib/python3.6/pandas/core/framework.py”第5323行中,can_concat=all(df.index.is_对于框架中的df是唯一的)AttributeError:'numpy:'。ndarray'对象没有属性'index'


共3个答案

匿名用户

嗯,取决于你是如何创造一个热点向量的。但是,如果它的排序与原始DataFrame相同,并且本身是DataFrame,则可以在加入之前添加相同的索引:

housing_cat_1hot.index = range(len(housing_cat_1hot))

如果不是DataFrame,请将其转换为DataFrame。这很简单只要两个对象排序相同

编辑:如果它不是一个数据帧,那么:housing\u cat\u 1hot=pd。数据框(外壳(cat热)

已经为您创建了适当的索引

匿名用户

如果您希望连接两个阵列(假设外壳和外壳都是阵列),可以使用

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()

匿名用户

感谢@Elez-shenhar回答,我得到以下工作代码:

OneHot=housing_cat_1hot.toarray()
OneHot= pd.DataFrame(OneHot)
result = housing.join(OneHot)
result.shape

(20640, 15)