即使在 Pandas 中使用 .iloc 也会出现索引越界错误

Posted

技术标签:

【中文标题】即使在 Pandas 中使用 .iloc 也会出现索引越界错误【英文标题】:Index out of bounds error even with .iloc in Pandas 【发布时间】:2018-06-29 14:49:06 【问题描述】:
fraud_indices = np.array(dataset[dataset.Class == 1].index)
fraud_samples = dataset.iloc[fraud_indices, :]

我在一个数据集上使用上述代码,该数据集有一列“类”,其中包含 0 和 1。我想做的很简单,我正在获取数据集中 Class == 1 的索引,并且我正在使用它来制作一个子集。

但是,即使索引是从同一数据集获得的,我在第二行也收到错误“位置索引器超出范围”。他们怎么可能越界?有人可以帮忙吗?

【问题讨论】:

dataset.loc[fraud_indices] 呢? .loc 没有给出错误但不能正常工作。我应该得到 492 行,但使用 .loc 我得到随机更高的行数 嗯,我再次检查您的问题,为什么不使用fraud_samples = dataset[dataset.Class == 1] 这样索引的目的是什么?为什么不dataset.loc[dataset.Class == 1, :] 【参考方案1】:

我想你只需要boolean indexing

fraud_samples = dataset[dataset.Class == 1]

如果需要索引:

fraud_indices = fraud_samples.index

但是,即使索引是从同一数据集获得的,我在第二行也收到错误“位置索引器超出范围”。他们怎么可能越界?

原因是您的索引不是默认值。因此,DataFrame 的长度和函数 iloc 按位置选择,而不是像 loc 这样的索引名称。

示例:

dataset = pd.DataFrame('Class':[0,1,0,1], index=[0,1,3,5])
print (dataset)
   Class
0      0
1      1
3      0
5      1

fraud_indices = np.array(dataset[dataset.Class == 1].index)
print (fraud_indices)
[1 5]

你不能选择第6行(python从0开始计数,所以5),因为DataFrame.iloc不存在:

fraud_samples = dataset.iloc[fraud_indices, :]
print (fraud_samples)

IndexError:位置索引器超出范围

但如果按DataFrame.loc 的索引值选择:

fraud_samples = dataset.loc[fraud_indices, :]
print (fraud_samples)
   Class
1      1
5      1

【讨论】:

以上是关于即使在 Pandas 中使用 .iloc 也会出现索引越界错误的主要内容,如果未能解决你的问题,请参考以下文章

iloc[ ]函数(Pandas库)

Pandas中iloc/loc/ix区别

快速学会pandas中Dataframe索引.ix,.iloc,.loc的使用以及区别

pandas子集选取的三种方法:[].loc[].iloc[]

在 Pandas 中,.iloc 方法是不是提供副本或视图?

使用 iloc 时的 Pandas SettingWithCopyWarning