Использование значения из других строк в Pandas кадре данных с помощью np.where - PullRequest
0 голосов
/ 07 августа 2020

Я хочу добавить новый столбец в фрейм данных, который принимает значение из столбца в следующей строке, если выполняются определенные условия.

df_psd['f2'] = np.where((df_psd['freq'] != 19.7403), df_psd.iloc[df_psd['index']+1,4], np.nan)

Я пытаюсь использовать np.where вместо перебора строк, так как фреймы данных очень большие (> 2,5 млн строк). Последняя строка в фрейме данных всегда будет иметь значение «freq», равное 19,7403. В фрейме данных есть столбец с именем index, который равен номеру строки.

Когда я пытаюсь запустить указанную выше строку, я получаю ошибку индекса.

IndexError: позиционные индексаторы выходят за границы

Если я удалю +1 из метода .iloc, он запустится, но вернет значение из той же строки, а не из следующей строки. Число 4 в методе '.ilo c' является правильным, поскольку без +1 он возвращает значение из правильного столбца только из неправильной строки.

Я попытался добавить еще одно условие в np.where term для проверки того, что он не приближается к концу фрейма данных, как показано ниже, но он по-прежнему вызывает ту же ошибку.

df_psd['f2'] = np.where((df_psd['freq'] != 19.7403) & (df_psd['index'] < (len(df_psd)-1)), df_psd.iloc[df_psd['index']+1,4], np.nan)

Если я изменяю возвращаемый термин, чтобы вернуть только индекс то я вижу, что он возвращает np.nan для правильных строк (т.е. условия работают правильно) и проверил, что это так для последней строки в фрейме данных.

Я пробовал искать по аналогичным вопросам о переполнении стека и прочитал документацию, но не могу понять, почему это дает мне ошибку индекса. Любой совет был бы большим подспорьем.

1 Ответ

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

Решение, предложенное @HenryYik, заключалось в том, чтобы сделать это на двух строках.

df_psd['f2'] = df_psd['freq'].shift(-1)
df_psd['f2'] = np.where((df_psd['freq'] == 19.7403), np.nan, df_psd['f2'])

Первая строка создает новый столбец, создавая сдвинутую копию старого столбца. Затем во второй строке используйте np.where для применения соответствующих условий.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...