【问题标题】:iloc on loop returns "single positional indexer is out-of-bounds" erroriloc 循环返回“单个位置索引器超出范围”错误
【发布时间】:2020-11-26 19:35:31
【问题描述】:

这是代码:

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 行。我试图找到第二列的平均增长率。我已经尝试了所有方法,但无法正常工作。

【问题讨论】:

  • 尝试通过添加数据示例和您正在寻找的输出来澄清您的问题:)

标签: python indexing


【解决方案1】:

如果您想使用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])

【讨论】:

    【解决方案2】:

    与其使用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 切片器以获得更好的清晰度。

    【讨论】:

      猜你喜欢
      • 2016-10-23
      • 2017-08-02
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-24
      • 2019-04-13
      相关资源
      最近更新 更多