Как перебирать предыдущие строки для сравнения значений в Pandas DataFrame - PullRequest
2 голосов
/ 21 октября 2019

У меня есть датафрейм от панд:

import pandas as pd
raw_data = [{'Date': '1-10-19', 'Price':7, 'Check': 0}, 
            {'Date': '2-10-19','Price':8.5, 'Check': 0}, 
            {'Date': '3-10-19','Price':9, 'Check': 1}, 
            {'Date': '4-10-19','Price':50, 'Check': 1}, 
            {'Date': '5-10-19','Price':80, 'Check': 1}, 
            {'Date': '6-10-19','Price':100, 'Check': 1}]
df = pd.DataFrame(raw_data)
df.set_index('Date')

Вот как это выглядит:

           Price  Check
Date        
1-10-19     7.0      0
2-10-19     8.5      0 
3-10-19     9.0      1
4-10-19     50.0     1 
5-10-19     80.0     1
6-10-19     100.0    1

Теперь я пытаюсь сделать так, чтобы для каждой строкигде «Проверка» равна 1, я хочу проверить количество строк до той строки, в которой цена была менее 10% от цены этой строки. Например, для 6-й строки, где цена равна 100, я хочу повторитьнад предыдущими строками и считайте количество строк до тех пор, пока цена не станет меньше 10 (10% от 100), что в данном случае будет на 3 строки раньше, чем цена равна 9. Затем нужно сохранить результаты в новом столбце.

Конечный результат будет выглядеть следующим образом:

           Price  Check  Rows_till_small
Date        
1-10-19     7.0      0    NaN
2-10-19     8.5      0    NaN
3-10-19     9.0      1    Nan
4-10-19     50.0     1    NaN
5-10-19     80.0     1    4
6-10-19     100.0    1    3

Я много думал о том, как я мог бы сделать это, используя какую-то функцию Роллинга, но я не думаю, что это возможно. Я также думал об итерациях по всему DataFrame с использованием iterrows или itertuple, но я не могу представить себе способ сделать это без крайней неэффективности.

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Проверьте это

diff = df['Price'].apply(lambda x:x > (df['Price']*.1))
RTS=[]
for i in range(len(df)):
    check = (diff)[i]
    ind = check.idxmax()
    if ind != 0:
        val = (i-ind)+1        
    else:
        val = np.nan
    RTS.append(val)
df['Rows_till_small'] = RTS
print(df)

Выход

       Date     Price   Check   Rows_till_small
0   1-10-19     7.0     0       NaN
1   2-10-19     8.5     0       NaN
2   3-10-19     9.0     1       NaN
3   4-10-19     50.0    1       NaN
4   5-10-19     80.0    1       4.0
5   6-10-19     100.0   1       3.0
1 голос
/ 21 октября 2019

Вы можете решить проблему следующим образом:

import pandas as pd
raw_data = [{'Date': '1-10-19', 'Price': 7, 'Check': 0},
            {'Date': '2-10-19', 'Price': 8.5, 'Check': 0},
            {'Date': '3-10-19', 'Price': 9, 'Check': 1},
            {'Date': '4-10-19', 'Price': 50, 'Check': 1},
            {'Date': '5-10-19', 'Price': 80, 'Check': 1},
            {'Date': '6-10-19', 'Price': 100, 'Check': 1}]
df = pd.DataFrame(raw_data)

new_column = [None] * len(df["Price"])  # create new column

for i in range(len(df["Price"])):
    if df['Check'][i] == 1:
        percent_10 = df['Price'][i] * 0.1
        for j in range(i, -1, -1):
            print(j)
            if df['Price'][j] < percent_10:
                new_column[i] = i - j
                break


df["New"] = new_column  # add new column

print(df)

Надеюсь, ответ вам пригодится, не стесняйтесь задавать вопросы.

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