Как ссылаться на ранее вычисленную строку в пандах без зацикливания? - PullRequest
0 голосов
/ 16 сентября 2018

Данные:

    day    cost    new_column
    1       1        0
    2       1        0
    3       5        enter position
    4       3        stay in position
    5       10       stay in position
    6       1        exit position
    7       1        0

Привет, мне интересно, есть ли способ ссылаться на предыдущую строку в вычисляемом столбце без зацикливания и использования loc / iloc. В приведенном выше примере я хочу вычислить этот 'new_column'. Как только стоимость достигнет 5, я хочу войти в позицию. Как только я нахожусь в позиции, я хочу иметь возможность проверить следующую строку, если я уже в позиции, и проверить, что цена не равна 1. Если это так, то я остаюсь в позиции. Первая строка, в которую я попал, где стоимость равна 1, а предыдущий «new_column» - «оставаться в позиции», я хочу сделать «выход из позиции». Затем следующая строка с 1, new_column должна вернуться к нулю.

Как я теперь решаю эту проблему, перебирая каждую строку, просматривая стоимость в строке i и статус new_column в строке i-1, затем вставляя результат в new_column в строке i.

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

Спасибо

1 Ответ

0 голосов
/ 16 сентября 2018

Привет, как предложил smj, одна из опций использует shift.

day = list(range(1,8))
cost = [1,1,5,3,10,1,1]

import pandas as pd
import numpy as np

df = pd.DataFrame({'day':day,'cost':cost}, columns = ['day', 'cost'])
print(df)
df['new'] = np.where(df['cost']> 1, np.where(
                                             df['cost'].shift(-1) >=1,
                                             'stay','a'
                                            ),
                     np.where(
                              df['cost'].shift()>1, 'exit', 0
                             )
                    )
print(df)
...