Scikit-Learn-对熊猫数据帧的某些列进行一次热编码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scikit-Learn-对熊猫数据帧的某些列进行一次热编码相关的知识,希望对你有一定的参考价值。

我有一个带有整数,浮点数和字符串列的数据框X。我想对“对象”类型的每一列进行一次热编码,所以我尝试这样做:

encoding_needed = X.select_dtypes(include='object').columns
ohe = preprocessing.OneHotEncoder()
X[encoding_needed] = ohe.fit_transform(X[encoding_needed].astype(str)) #need astype bc I imputed with 0, so some rows have a mix of zeroes and strings.

但是,我最终得到IndexError: tuple index out of range。根据编码器期望的documentation,我不太了解这一点,因此我应该可以通过数据帧。如何单编码X: array-like, shape [n_samples, n_features]中特别标记的列列表?

编辑:

数据是机密的,所以我不能共享它,也不能创建虚拟对象,因为它具有123列。

我可以提供以下内容:

encoding_needed

完整堆栈:

X.shape: (40755, 123)
encoding_needed.shape: (81,) and is a subset of columns.
答案

没有看到您的数据,我很难找到您的错误。您可以尝试使用熊猫的--------------------------------------------------------------------------- IndexError Traceback (most recent call last) <ipython-input-90-6b3e9fdb6f91> in <module>() 1 encoding_needed = X.select_dtypes(include='object').columns 2 ohe = preprocessing.OneHotEncoder() ----> 3 X[encoding_needed] = ohe.fit_transform(X[encoding_needed].astype(str)) ~/anaconda3/envs/python3/lib/python3.6/site-packages/pandas/core/frame.py in __setitem__(self, key, value) 3365 self._setitem_frame(key, value) 3366 elif isinstance(key, (Series, np.ndarray, list, Index)): -> 3367 self._setitem_array(key, value) 3368 else: 3369 # set column ~/anaconda3/envs/python3/lib/python3.6/site-packages/pandas/core/frame.py in _setitem_array(self, key, value) 3393 indexer = self.loc._convert_to_indexer(key, axis=1) 3394 self._check_setitem_copy() -> 3395 self.loc._setitem_with_indexer((slice(None), indexer), value) 3396 3397 def _setitem_frame(self, key, value): ~/anaconda3/envs/python3/lib/python3.6/site-packages/pandas/core/indexing.py in _setitem_with_indexer(self, indexer, value) 592 # GH 7551 593 value = np.array(value, dtype=object) --> 594 if len(labels) != value.shape[1]: 595 raise ValueError('Must have equal len keys and value ' 596 'when setting with an ndarray') IndexError: tuple index out of range 方法吗?

get_dummies
另一答案
pd.get_dummies(X[encoding_needed])

使用# example data X = pd.DataFrame({'int':[0,1,2,3], 'float':[4.0, 5.0, 6.0, 7.0], 'string1':list('abcd'), 'string2':list('efgh')}) int float string1 string2 0 0 4.0 a e 1 1 5.0 b f 2 2 6.0 c g 3 3 7.0 d h

使用pandas,它将自动选择您的pandas.get_dummies列并删除这些列,同时保留一个热编码的列:

object

使用pd.get_dummies(X) int float string1_a string1_b string1_c string1_d string2_e 0 0 4.0 1 0 0 0 1 1 1 5.0 0 1 0 0 0 2 2 6.0 0 0 1 0 0 3 3 7.0 0 0 0 1 0 string2_f string2_g string2_h 0 0 0 0 1 1 0 0 2 0 1 0 3 0 0 1

这里我们必须指定我们只需要sklearn列:

object

以上是关于Scikit-Learn-对熊猫数据帧的某些列进行一次热编码的主要内容,如果未能解决你的问题,请参考以下文章

将大熊猫数据帧的每一列与同一数据帧的每一列相乘的最有效方法

按时间戳列过滤/选择熊猫数据帧的行

根据第二个数据帧的匹配列更新熊猫数据帧

如何检查熊猫数据框行在各个列中是不是具有某些值,可扩展性

如何将每一行熊猫数据帧附加到另一个数据帧的每一行

我需要以相同的随机方式随机打乱两个熊猫数据帧的行