Как сгруппировать данные по дате и времени по идентификатору и периоду времени?

#pandas #pandas-groupby #data-science

#pandas #pandas-groupby #наука о данных

Вопрос:

Итак, у меня есть такие данные. В основном есть куча людей, которые что-то делают, и мы отслеживаем их. Итак, меня интересует одно из действий, то есть запуск. ID — идентификатор пользователя, дата — дата, ГОТОВО — Да, если они выполняются в этот день. Я хочу узнать, сколько раз люди выполняли это действие в определенные периоды.

 ID             DATE              DONE  
1           2009-1-3             Yes
1           2009-1-15            Yes
2           2009-9-3             Yes
3           2009-10-7            No
1           2009-12-1            Yes
3           2009-10-8            Yes
2           2009-10-21           Yes
 

Я хочу что-то подобное, не обязательно точно так.

 ID          PERIOD              COUNT
1           2009-1              2
            2009-12             1
2           2009-9              1
            2009-10             1
3           2009-10             1
 

Заранее спасибо!

Ответ №1:

Если необходимо подсчитать также No значения, такие как 0 aggregate sum с логической маской, для месячных периодов используйте Series.dt.to_period :

 df1 = ((df['DONE'] == 'Yes')
        .groupby([df['ID'], pd.to_datetime(df['DATE']).dt.to_period('m')])
        .sum()
        .astype(int)
        .reset_index(name='COUNT'))
print (df1)
   ID     DATE  COUNT
0   1  2009-01      2
1   1  2009-12      1
2   2  2009-09      1
3   2  2009-10      1
4   3  2009-10      1
 

Или вы можете сначала отфильтровать только строки с Yes помощью и агрегировать подсчеты по GroupBy.size :

 df1 = (df[df['DONE'] == 'Yes']
        .groupby(['ID', pd.to_datetime(df['DATE']).dt.to_period('m')])
        .size()
        .reset_index(name='COUNT'))
print (df1)
   ID     DATE  COUNT
0   1  2009-01      2
1   1  2009-12      1
2   2  2009-09      1
3   2  2009-10      1
4   3  2009-10      1