Рассчитать количество пользователей в месяц, сгруппированных по первому месяцу, python
Мне нужно подсчитать количество пользователей за каждый месяц, сгруппировав их по месяцам первого посещения. Есть таблица visit, содержащая данные: id — номер пользователя, FirstVisit — дата первого посещения, LastVisit — дата последнего посещения.
| id | FirstVisit | LastVisit |
|---|---|---|
| 1 | 03.02.2021 | 10.10.2021 |
| 2 | 10.02.2021 | 12.12.2021 |
| 3 | 15.01.2021 | 01.02.2022 |
| 4 | 14.05.2021 | 04.03.2022 |
| 5 | 12.05.2021 | 15.05.2021 |
| 1 | 03.02.2021 | 10.10.2021 |
| 3 | 15.01.2021 | 01.02.2022 |
В результате мне нужно создать фрейм данных:
| FirstVisit | Month | cnt |
|---|---|---|
| 2021.01 | 2021.01 | 1 |
| 2021.01 | 2021.02 | 1 |
| 2021.01 | 2021.03 | 1 |
| 2021.01 | 2021.04 | 1 |
| 2021.01 | 2021.05 | 1 |
| 2021.01 | 2021.06 | 1 |
| 2021.01 | 2021.07 | 1 |
| 2021.01 | 2021.08 | 1 |
| 2021.01 | 2021.09 | 1 |
| 2021.01 | 2021.10 | 1 |
| 2021.01 | 2021.11 | 1 |
| 2021.01 | 2021.12 | 1 |
| 2021.01 | 2022.01 | 1 |
| 2021.01 | 2022.02 | 1 |
| 2021.02 | 2021.02 | 2 |
| 2021.02 | 2021.03 | 2 |
| 2021.02 | 2021.04 | 2 |
| 2021.02 | 2021.05 | 2 |
| 2021.02 | 2021.06 | 2 |
| 2021.02 | 2021.07 | 2 |
| 2021.02 | 2021.08 | 2 |
| 2021.02 | 2021.09 | 2 |
| 2021.02 | 2021.10 | 2 |
| 2021.02 | 2021.11 | 1 |
| 2021.02 | 2021.12 | 1 |
| 2021.05 | 2021.05 | 2 |
| 2021.05 | 2021.06 | 1 |
| 2021.05 | 2021.07 | 1 |
| 2021.05 | 2021.08 | 1 |
| 2021.05 | 2021.09 | 1 |
| 2021.05 | 2021.10 | 1 |
| 2021.05 | 2021.11 | 1 |
| 2021.05 | 2021.12 | 1 |
| 2021.05 | 2022.01 | 1 |
| 2021.05 | 2022.02 | 1 |
| 2021.05 | 2022.03 | 1 |
Я создал функцию для подсчета количества пользователей за каждый месяц:
fun = lambda m:np.where((visit.FirstVisit <=m) & (visit.LastVisit >=m),visit.inn,0)
df=pd.DataFrame(pd.date_range(visit.FirstVisit.min(),visit.LastVisit.max(), freq='M').strftime('%Y-%m'),columns=['Month'])
df['cnt']=df.Month.map(lambda x:np.count_nonzero(np.unique(fun(x))))
Но не могу добавить группировку по полю FirstVisit. Создал примерный цикл, как вижу результат, но пока не правильный
for i in (pd.date_range(visit.FirstVisit.min(),visit.FirstVisit.max(),freq='M').strftime('%Y-%m')):
for m in (pd.date_range(visit.FirstVisit.min(),visit.LastVisit.max(),freq='M').strftime('%Y-%m')):
if (pd.to_datetime(visit.FirstVisit, format ='%Y-%m')==i) & (visit.FirstVisit<=m) & (visit.LastVisit >= m) :
df1=df1.append({'FirstVisit': i,'Months': m,'cnt': df1.Month.map(lambda x:np.count_nonzero(np.unique(fun(x))))})