ilo c on l oop возвращает ошибку «одиночный позиционный индексатор выходит за пределы» - PullRequest
0 голосов
/ 06 августа 2020

Это код:

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 голосов
/ 06 августа 2020

Вместо использования функции range() безопаснее просто перебирать индекс, ie.:

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

Также вы можете оптимизировать этот код дальше и избавиться от for l oop вместе, ie.:

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 для большей ясности.

0 голосов
/ 06 августа 2020

Ваш диапазон на один шаг больше, если вы хотите использовать 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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...