Найти вхождения в последние 6 месяцев построчно, используя Pandas DataFrame - PullRequest
2 голосов
/ 15 апреля 2019

Допустим, у меня есть такой набор данных:

  id_police id_sinistre    datesurv
0      p123        s120  01/01/2018
1      p123        s121  03/01/2018
2      p123        s122  05/05/2018
3      p222        s123  04/05/2018
4      p222        s124  02/12/2018
5      p433        s125  07/08/2018
6      p433        s126  08/09/2018
7      p433        s127  10/10/2018

Моя цель - найти последние вхождения id_police за последние 6 месяцев для каждой строки, например:

  id_police id_sinistre    datesurv  occ
0      p123        s120  01/01/2018    0
1      p123        s121  03/01/2018    1
2      p123        s122  05/05/2018    2
3      p222        s123  04/05/2018    0
4      p222        s124  02/12/2018    0
5      p433        s125  07/08/2018    0
6      p433        s126  08/09/2018    1
7      p433        s127  10/10/2018    2

Думаю, мне понадобятся .duplicated или .groupby, но я не уверен, как их использовать ... Заранее спасибо за помощь!

Ответы [ 2 ]

3 голосов
/ 15 апреля 2019

Другой вариант: GroupBy datesurv, а также использование pd.Grouper для создания групп по 6 месяцев и принятия cumcount:

df.datesurv = pd.to_datetime(df.datesurv, format='%d/%m/%Y')
g = pd.Grouper(key='datesurv', freq='6MS')
df.assign(occ=df.groupby(['id_police', g]).cumcount())

   id_police id_sinistre   datesurv  occ
0      p123        s120 2018-01-01    0
1      p123        s121 2018-01-03    1
2      p123        s122 2018-05-05    2
3      p222        s123 2018-05-04    0
4      p222        s124 2018-12-02    0
5      p433        s125 2018-08-07    0
6      p433        s126 2018-09-08    1
7      p433        s127 2018-10-10    2
3 голосов
/ 15 апреля 2019

Если 6 месяцев следует упростить в течение 6 * 30 дней, используйте пользовательскую лямбда-функцию с diff, сравните по значению и последней совокупной сумме:

df['datesurv'] = pd.to_datetime(df['datesurv'], dayfirst=True)

df = df.sort_values(['id_police','datesurv'])

f = lambda x: (x.diff().dt.days < 30 * 6).cumsum()
df['occ'] = df.groupby('id_police')['datesurv'].apply(f)

print (df)
  id_police id_sinistre   datesurv  occ
0      p123        s120 2018-01-01    0
1      p123        s121 2018-01-03    1
2      p123        s122 2018-05-05    2
3      p222        s123 2018-05-04    0
4      p222        s124 2018-12-02    0
5      p433        s125 2018-08-07    0
6      p433        s126 2018-09-08    1
7      p433        s127 2018-10-10    2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...