How to resolve an IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

How to resolve an IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

当我使用下面的代码时发生了 IndexError。详情如下所示。

def get_code(seq): 
    return [x.split('.')[0] for x in seq if x]

all_codes = get_code(all_cats)
code_index = pd.Index(np.unique(all_codes))
dummy_frame = df(np.zeros((len(data), len(code_index))), index=data.index, columns=code_index)

for row, cat in zip(data.index, data.CATEGORY):
    codes = get_code(to_cat_list(cat))
    dummy_frame.iloc[row, codes] = 1

data = data.join(dummy_frame.add_prefix('category_'))

data.iloc[:, 10:15]

下图是发生的 IndexError。

---------------------------------------------------------------------------

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

---------------------------------------------------------------------------

但是,错误发生在下面的代码行,

dummy_frame.iloc[row, codes] = 1

如何解决上述错误以获取以下信息。

category_1  100 non-null values
category_1a 100 non-null values
category_1b 100 non-null values
category_1c 100 non-null values
category_1d 100 non-null values

iloc 用于基于整数的索引并将 ["1", "3"] 传递给它作为列索引器部分是它失败的原因。您可以获得整数索引,即 ["1", "3"] 在框架列中的位置并传递:

# these are integer positions of `codes` so that `iloc` works
codes_positions = dummy_frame.columns.get_indexer(codes)

# using `codes_positions` instead of `codes` directly
dummy_frame.iloc[row, codes_positions] = 1

还有 loc 查找基于标签的索引而不是整数。看来你的行索引是 0..N-1 所以 loc 也可以在这里工作:

# indexers remain the same but now using `loc`
dummy_frame.loc[row, codes] = 1

但请注意,仅当索引条目为整数时(在您的情况下似乎如此),loc 才可以替代 iloc。否则,第一种方法更通用,更不容易出错并且更能阐明意图。