Как сгруппировать данные даты и времени по идентификатору и периоду времени? - PullRequest
1 голос
/ 17 апреля 2019

Итак, у меня есть такие данные.По сути, есть кучка людей, которые что-то делают, и мы следим за ними.Поэтому меня интересует одно из занятий, т.е. бег.ID - идентификатор человека, дата - дата, DONE - Да, если они запускаются в этот день.Я хочу узнать в определенные периоды, сколько раз люди выполняли эту деятельность.

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 Ответ

1 голос
/ 17 апреля 2019

Если необходимо, подсчитайте также No значения, такие как 0 совокупность 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
...