【问题标题】:OneHotEncoding raises IndexError: arrays used as indices must be of integer (or boolean) typeOneHotEncoding 引发 IndexError:用作索引的数组必须是整数(或布尔)类型
【发布时间】:2017-10-03 04:18:01
【问题描述】:

我有一个名为 data 的数据框,它具有以下给定属性:

[880 rows x 10 columns]
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 880 entries, (123, 456) to (789, 890)
Data columns (total 10 columns):
Date_Diff            880 non-null float64
Response             880 non-null category
Len1                 880 non-null int64
Type1                877 non-null category
Len2                 880 non-null int64
Type2                880 non-null category
Len_Diff             880 non-null int64
Same_Institution     880 non-null category
Same_Type            880 non-null category
Score                880 non-null float64
dtypes: category(5), float64(2), int64(3)
memory usage: 82.0+ KB
None

注意:数据帧上的索引是称为 ID1 和 ID2 的字符串列。这就是我设置多索引的方式:data = data.set_index(['ID1','ID2'], drop = True)。由于drop = True,您不会在上述数据框中看到它们。

我正在尝试使用LabelEncoderOneHotEncoder 对分类变量Type1Type2 进行编码。这是我的代码:

# Encoding function
def encode(data):
    global cat_columns
    cat_columns = list(data.select_dtypes(include=['category','object']))
    le = LabelEncoder()
    ohe = OneHotEncoder(categorical_features = cat_columns)
    for col in cat_columns:
        data[col] = le.fit_transform(data[col])
    data = ohe.fit_transform(data)
    return data

# Use encoding function
encode(data)

当我运行此代码时,我得到一个IndexError。错误是:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-xxx> in <module>()
     14     return data
     15 
---> 16 encode(data)

<ipython-input-xxx> in encode(data)
---> 13     data = ohe.fit_transform(data)
     14     return data
     15 

/Users/username/anaconda2/lib/python2.7/site-packages/sklearn/preprocessing/data.pyc in fit_transform(self, X, y)
   1900         """
   1901         return _transform_selected(X, self._fit_transform,
-> 1902                                    self.categorical_features, copy=True)
   1903 
   1904     def _transform(self, X):

/Users/username/anaconda2/lib/python2.7/site-packages/sklearn/preprocessing/data.pyc in _transform_selected(X, transform, selected, copy)
   1706     ind = np.arange(n_features)
   1707     sel = np.zeros(n_features, dtype=bool)
-> 1708     sel[np.asarray(selected)] = True
   1709     not_sel = np.logical_not(sel)
   1710     n_selected = np.sum(sel)

IndexError: arrays used as indices must be of integer (or boolean) type

是什么导致了这个错误?
我尝试将 ID 作为索引删除并尝试过,仍然抛出相同的错误。

编辑: 在此处添加数据框的子集:运行 html sn-p 以将其视为表格。
某些列的数据类型已 从此改变。数据类型在数据框属性中更新
Response 是目标变量,是分类变量。
Same_InstitutionSame_Type 已从整数更改为分类二进制变量
Type1Type2 已从 pandas 对象更改为类别

&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;ID1&lt;/th&gt;&lt;th&gt;ID2&lt;/th&gt;&lt;th&gt;Len1&lt;/th&gt;&lt;th&gt;Type1&lt;/th&gt;&lt;th&gt;Len2&lt;/th&gt;&lt;th&gt;Type2&lt;/th&gt;&lt;th&gt;Len_Diff&lt;/th&gt;&lt;th&gt;Date_Diff&lt;/th&gt;&lt;th&gt;Same_Institution&lt;/th&gt;&lt;th&gt;Same_Type&lt;/th&gt;&lt;th&gt;Score&lt;/th&gt;&lt;th&gt;Response&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;121&lt;/td&gt;&lt;td&gt;977&lt;/td&gt;&lt;td&gt;10185&lt;/td&gt;&lt;td&gt;PR&lt;/td&gt;&lt;td&gt;10185&lt;/td&gt;&lt;td&gt;MR&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;214&lt;/td&gt;&lt;td&gt;753&lt;/td&gt;&lt;td&gt;5039&lt;/td&gt;&lt;td&gt;MR&lt;/td&gt;&lt;td&gt;4926&lt;/td&gt;&lt;td&gt;MR&lt;/td&gt;&lt;td&gt;113&lt;/td&gt;&lt;td&gt;9.266666667&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;0.997031978&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;378&lt;/td&gt;&lt;td&gt;919&lt;/td&gt;&lt;td&gt;45404&lt;/td&gt;&lt;td&gt;PR&lt;/td&gt;&lt;td&gt;45404&lt;/td&gt;&lt;td&gt;PR&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;283&lt;/td&gt;&lt;td&gt;685&lt;/td&gt;&lt;td&gt;821076&lt;/td&gt;&lt;td&gt;40-F&lt;/td&gt;&lt;td&gt;412353&lt;/td&gt;&lt;td&gt;AR&lt;/td&gt;&lt;td&gt;408723&lt;/td&gt;&lt;td&gt;0.35&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0.888266653&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;452&lt;/td&gt;&lt;td&gt;837&lt;/td&gt;&lt;td&gt;16343&lt;/td&gt;&lt;td&gt;PR&lt;/td&gt;&lt;td&gt;16343&lt;/td&gt;&lt;td&gt;PR&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;333&lt;/td&gt;&lt;td&gt;726&lt;/td&gt;&lt;td&gt;22204&lt;/td&gt;&lt;td&gt;PR&lt;/td&gt;&lt;td&gt;20897&lt;/td&gt;&lt;td&gt;6-K&lt;/td&gt;&lt;td&gt;1307&lt;/td&gt;&lt;td&gt;11.3&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0.99251128&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;107&lt;/td&gt;&lt;td&gt;960&lt;/td&gt;&lt;td&gt;9781&lt;/td&gt;&lt;td&gt;6-K&lt;/td&gt;&lt;td&gt;6073&lt;/td&gt;&lt;td&gt;MR&lt;/td&gt;&lt;td&gt;3708&lt;/td&gt;&lt;td&gt;0.483333333&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0.933646747&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;236&lt;/td&gt;&lt;td&gt;768&lt;/td&gt;&lt;td&gt;3375&lt;/td&gt;&lt;td&gt;PR&lt;/td&gt;&lt;td&gt;2945&lt;/td&gt;&lt;td&gt;MR&lt;/td&gt;&lt;td&gt;430&lt;/td&gt;&lt;td&gt;46.58333333&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0.239269675&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;419&lt;/td&gt;&lt;td&gt;829&lt;/td&gt;&lt;td&gt;81247&lt;/td&gt;&lt;td&gt;MR&lt;/td&gt;&lt;td&gt;81247&lt;/td&gt;&lt;td&gt;MR&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0.016666667&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;184&lt;/td&gt;&lt;td&gt;991&lt;/td&gt;&lt;td&gt;51474&lt;/td&gt;&lt;td&gt;PR&lt;/td&gt;&lt;td&gt;51474&lt;/td&gt;&lt;td&gt;ER&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;217&lt;/td&gt;&lt;td&gt;868&lt;/td&gt;&lt;td&gt;23714&lt;/td&gt;&lt;td&gt;ER&lt;/td&gt;&lt;td&gt;26633&lt;/td&gt;&lt;td&gt;8-K&lt;/td&gt;&lt;td&gt;2919&lt;/td&gt;&lt;td&gt;1.716666667&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0.980611207&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;202&lt;/td&gt;&lt;td&gt;622&lt;/td&gt;&lt;td&gt;4638&lt;/td&gt;&lt;td&gt;MR&lt;/td&gt;&lt;td&gt;4638&lt;/td&gt;&lt;td&gt;PR&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;308&lt;/td&gt;&lt;td&gt;883&lt;/td&gt;&lt;td&gt;73476&lt;/td&gt;&lt;td&gt;ER&lt;/td&gt;&lt;td&gt;404584&lt;/td&gt;&lt;td&gt;6-K&lt;/td&gt;&lt;td&gt;331108&lt;/td&gt;&lt;td&gt;12.58333333&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0.825482503&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;186&lt;/td&gt;&lt;td&gt;880&lt;/td&gt;&lt;td&gt;291279&lt;/td&gt;&lt;td&gt;FIN SUPP&lt;/td&gt;&lt;td&gt;320893&lt;/td&gt;&lt;td&gt;6-K&lt;/td&gt;&lt;td&gt;29614&lt;/td&gt;&lt;td&gt;4.483333333&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0.991668299&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;305&lt;/td&gt;&lt;td&gt;896&lt;/td&gt;&lt;td&gt;22988&lt;/td&gt;&lt;td&gt;PR&lt;/td&gt;&lt;td&gt;28554&lt;/td&gt;&lt;td&gt;6-K&lt;/td&gt;&lt;td&gt;5566&lt;/td&gt;&lt;td&gt;22.1&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0.941192693&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;

【问题讨论】:

  • 只是想知道..你看过get_dummies吗?
  • @Scratch'N'Purr 提到,熊猫的 get_dummies 可能无需处理 sklearn 就可以做到这一点。此外,如果您可以添加一小部分可以重现错误的数据,那么人们可能会更容易回答。
  • 您能否发布一小部分发生此错误的数据,以及您制作数据帧的方式?
  • 在问题中添加了一段数据集。
  • @Scratch'N'Purr,get_dummies 工作正常顺便说一句。只是想试试OneHotEncoder

标签: python scikit-learn dummy-variable one-hot-encoding index-error


【解决方案1】:

我在使用 OneHotEncoder 时遇到了完全相同的错误。

核心问题是 categorical_features 参数不处理命名列。来自 OneHotEncoder 文档:

categorical_features : "all" or array of indices or mask
    Specify what features are treated as categorical.

    - 'all' (default): All features are treated as categorical.
    - array of indices: Array of categorical feature indices.
    - mask: Array of length n_features and with dtype=bool.

对我有用的是首先使用 sn-p 生成一个布尔掩码,例如:

cat_columns = list(data.select_dtypes(include=['category','object']))
column_mask = []
for column_name in list(data.columns.values):
    column_mask.append(column_name in cat_columns)

# And then pass the column_mask into the OneHotEncoder
ohe = OneHotEncoder(categorical_features = column_mask)

所以你原来的功能是:

# Encoding function
def encode(data):
    global cat_columns
    cat_columns = list(data.select_dtypes(include=['category','object']))
    column_mask = []
    for column_name in list(data.columns.values):
        column_mask.append(column_name in cat_columns)
    le = LabelEncoder()
    ohe = OneHotEncoder(categorical_features = column_mask)
    for col in cat_columns:
        data[col] = le.fit_transform(data[col])
    data = ohe.fit_transform(data)
    return data

# Use encoding function
encode(data)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 2021-08-31
    相关资源
    最近更新 更多