#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