2 votes

Pandas en Python : groupby date et compter les nouveaux enregistrements pour chaque période

J'essaie d'utiliser Python Pandas pour compter les visiteurs qui reviennent quotidiennement sur mon site Web pendant une période donnée.

Exemple de données :

df1 = pd.DataFrame({'user_id':[1,2,3,1,3], 'date':['2012-09-29','2012-09-30','2012-09-30','2012-10-01','2012-10-01']})

print df1
         date  user_id
0  2012-09-29        1
1  2012-09-30        2
2  2012-09-30        3
3  2012-10-01        1
4  2012-10-01        3

Ce que j'aimerais avoir comme résultat final :

df1_result = pd.DataFrame({'count_new':[1,2,0], 'date':['2012-09-29','2012-09-30','2012-10-01']})

print df1_result
   count_new        date
0          1  2012-09-29
1          2  2012-09-30
2          0  2012-10-01

Le premier jour, il y a 1 nouvel utilisateur car l'utilisateur 1 apparaît pour la première fois.

Le deuxième jour, il y a 2 nouveaux utilisateurs : l'utilisateur 2 et l'utilisateur 3 apparaissent tous deux pour la première fois.

Enfin, au troisième jour, il y a 0 nouvel utilisateur : l'utilisateur 1 et l'utilisateur 3 sont déjà apparus au cours des périodes précédentes.

Jusqu'à présent, j'ai cherché à fusionner deux copies d'un même cadre de données et à en décaler une d'une date, mais sans succès :

pd.merge(df1, df1.user_id.shift(-date), on = 'date').groupby('date')['user_id_y'].nunique()

Toute aide serait très appréciée,

Merci

2voto

Alexander Points 49390
>>> (df1
     .groupby(['user_id'], as_index=False)['date']  # Group by `user_id` and get first date.
     .first()
     .groupby(['date'])  # Group result on `date` and take counts.
     .count()
     .reindex(df1['date'].unique())  # Reindex on original dates.
     .fillna(0))  # Fill null values with zero.
            user_id
date               
2012-09-29        1
2012-09-30        2
2012-10-01        0

1voto

W-B Points 94428

Il est préférable d'ajouter une nouvelle colonne Isreturning (au cas où vous auriez besoin d'effectuer une analyse sur le client de retour dans le futur)

df['Isreturning']=df.groupby('user_id').cumcount()

Afficher uniquement les nouveaux clients

df.loc[df.Isreturning==0,:].groupby('date')['user_id'].count()
Out[840]: 
date
2012-09-29    1
2012-09-30    2
Name: user_id, dtype: int64

Ou vous pouvez :

df.groupby('date')['Isreturning'].apply(lambda x : len(x[x==0]))
Out[843]: 
date
2012-09-29    1
2012-09-30    2
2012-10-01    0
Name: Isreturning, dtype: int64

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X