iloc在循环上返回“单个位置索引器超出范围”错误

时间:2020-08-06 14:02:30

标签: python indexing

这是代码:

for e in range(1, len(db.index)):
    g.append((db.iloc[e + 1, 1] - db.iloc[e, 1]) * 100.0 / db.iloc[e, 1])

数据帧(db)有2个列和284行。我试图找到第二列的平均增长率。我已经尝试了所有方法,但是无法正常工作。

2 个答案:

答案 0 :(得分:0)

如果您想使用e+1进行索引,则您的范围太长了一步。试试:

for e in range(1, len(db.index) -1):  # one step shorter
    g.append((db.iloc[e + 1, 1] - db.iloc[e, 1]) * 100.0 / db.iloc[e, 1])

答案 1 :(得分:0)

与其使用range()函数,不如通过索引进行迭代,这是更安全的:

for e in db.index:
    g.append((db.iloc[e+1, 1] - db.iloc[e, 1]) * 100.0 / db.iloc[e,1])

您还可以进一步优化此代码,并完全摆脱for循环,即:

db.iloc[:,1].diff().multiply(100).div(db.iloc[:,1].shift())

此代码将返回一个pd.Series,您可以将其分配给g

g = db.iloc[:,1].diff().multiply(100).div(db.iloc[:,1].shift())

或附加到它已经包含一些数据的地方:

g = pd.concat([g, db.iloc[:,1].diff().multiply(100).div(db.iloc[:,1].shift())
])

如果您遵循我的建议,那么您也可以立即使用第1列的名称,而不是使用iloc切片器,以获得更好的清晰度。