Подсчитать максимальное количество последовательных 1 с на группу - PullRequest
0 голосов
/ 16 января 2019

Учитывая фрейм данных следующей структуры

df1  = pd.DataFrame( data = {'userid':[465,465,999,999,999,999],
                      'postedDate':[pd.to_datetime('2018-11-01'),pd.to_datetime('2018-11-20'),pd.to_datetime('2018-11-01'),pd.to_datetime('2018-11-08'),pd.to_datetime('2018-11-14'), pd.to_datetime('2018-11-29')],
                      'value':[1,1,1,1,1,1]}).set_index('postedDate')

df1 = df1.groupby('userid').resample('W').count().drop('userid', axis =1 )
df1

userid  postedDate  value
465     2018-11-04    1
        2018-11-11    0
        2018-11-18    0
        2018-11-25    1
999     2018-11-04    1
        2018-11-11    1
        2018-11-18    1
        2018-11-25    0
        2018-12-02    1

Для каждого идентификатора пользователя я хотел бы получить максимальное количество последовательных недель со значением = 1. Результат долженbe

userid  max_consecutive_wks
465        1
999        3

Учитывая размер набора данных, любое решение, использующее для циклов , не будет работать в Python, поэтому я ищу Pandas / Numpy только векторизованный подход.

1 Ответ

0 голосов
/ 16 января 2019

Используйте трюк с переменным смещением, чтобы получить все группы последовательных 1 с, а затем используйте value_counts, чтобы найти наибольшую группу.

u = df1['value'].eq(1)
v = u.ne(u.shift()).cumsum().where(u)

v.groupby(level=0).value_counts().max(level=0).reset_index(name='max_consec_wks')

   userid  max_consec_wks
0     465               1
1     999               3

Вызов where требуется, чтобы гарантировать, что рассматриваются только группы из 1 (а не 0).

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