Получите N рядов от значения в пандах - PullRequest
1 голос
/ 21 октября 2019

У меня есть список ежемесячных номеров продаж для событий. У меня есть столбец Event_Ind, который указывает, было ли в этом месяце событие. Мне нужно получить 3 значения (включительно) до каждого события. Допускается перекрытие значений.

import pandas as pd
dates = pd.date_range(start='2019-01-01', end='2020-01-01', freq='M')
values = [1000,1067,1099,1100,2000,1000,1057,1082,1200,1300,1453,1500]
event_ind = ["*","","","","*","","","","*","","*",""]
df = pd.DataFrame({'Dates':dates, 'Values':values, 'Event_Ind':event_ind})


        Dates  Values Event_Ind
0  2019-01-31    1000         *
1  2019-02-28    1067          
2  2019-03-31    1099          
3  2019-04-30    1100          
4  2019-05-31    2000         *
5  2019-06-30    1000          
6  2019-07-31    1057          
7  2019-08-31    1082          
8  2019-09-30    1200         *
9  2019-10-31    1300          
10 2019-11-30    1453         *
11 2019-12-31    1500         

Цель для этих примеров данных:

    Dates   Values  Event_Ind
0   1/31/2019   1000    *
1   3/31/2019   1099    
2   4/30/2019   1100    
3   5/31/2019   2000    *
4   7/31/2019   1057    
5   8/31/2019   1082    
6   9/30/2019   1200    *
7   9/30/2019   1200    *
8   10/31/2019  1300    
9   11/30/2019  1453    *

Я думаю, что могу что-то сделать с shift()или groupby.tail(). Но я не могу использовать их, чтобы получить желаемый результат

Ответы [ 2 ]

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

Вы могли бы что-то вроде этого:

s = df.Event_Ind.eq('*')
i = np.concatenate([np.arange(a,b+1) for b,a in zip(s[s].index, s[s].index - 2)])

df.loc[i[i>=0]]

        Dates  Values Event_Ind
0  2019-01-31    1000         *
1  2019-02-28    1067          
2  2019-03-31    1099          
3  2019-04-30    1100          
4  2019-05-31    2000         *
5  2019-06-30    1000          
6  2019-07-31    1057          
7  2019-08-31    1082          
8  2019-09-30    1200         *
7  2019-08-31    1082          
8  2019-09-30    1200         *
9  2019-10-31    1300          
10 2019-11-30    1453         *

Объяснение

[np.arange(a,b+1) for b,a in zip(s[s].index, s[s].index - 2)]

Код вышеzip s значения индексов с * с индексами двумя строками выше. Таким образом, np.arange(a,b+1) возвращает индексы строк, которые вы хотите отобразить в финале df.

Поскольку вышеизложенное генерирует список массивов, вы хотите np.concatenate все, чтобы иметь один массивсохраняемые индексы.

df.loc[i[i>=0]]

Наконец, вышеупомянутое сначала фильтрует все значения в i, которые являются отрицательными (потому что отрицательные индексы в python имеют значение) и df.loc[], чтобы получить окончательный df.

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

Попробуйте:

x=df["Event_Ind"]=="*"
ind=list(map(lambda i: any(x[i:i+3]), range(len(x))))
print(df.loc[ind])

Вывод:

Dates  Values Event_Ind
0  2019-01-31    1000         *
2  2019-03-31    1099
3  2019-04-30    1100
4  2019-05-31    2000         *
6  2019-07-31    1057
7  2019-08-31    1082
8  2019-09-30    1200         *
9  2019-10-31    1300
10 2019-11-30    1453         *

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