[PYTHON] Agréger les données d'événement dans un format un seul utilisateur sur une ligne à l'aide de pandas

introduction

Cette fois, le mot «données d'événement» est utilisé pour désigner des données telles que ** (heure, nom de l'événement (, utilisateur) (, quantité)) **. Lorsque vous essayez de créer un modèle de prédiction utilisateur, vous souhaiterez peut-être formater ces données d'événement de manière à ce qu'elles soient "un utilisateur, une ligne".

Prenez note de la façon dont les pandas gèrent ce domaine.

Méthode

Tout d'abord, considérez les données d'événement suivantes à titre d'exemple.

import pandas as pd

data = [
    ['user1', '2015-7-1 10:00:00', 'login'],
    ['user1', '2015-7-1 10:00:10', 'item'],
    ['user1', '2015-7-1 10:00:30', 'item'],
    ['user2', '2015-7-1 10:01:00', 'top'],
    ['user1', '2015-7-1 10:01:30', 'cart'],
    ['user2', '2015-7-1 10:01:50', 'login'],
    ['user2', '2015-7-1 10:02:30', 'logout'],

    ['user1', '2015-7-2 13:00:00', 'login'],
    ['user1', '2015-7-2 13:01:00', 'logout'],
    ['user3', '2015-7-2 13:01:00', 'top'],
    ['user2', '2015-7-2 13:01:50', 'login'],
    ['user2', '2015-7-2 13:02:30', 'item'],
    ['user2', '2015-7-2 13:03:30', 'cart'],
    ['user2', '2015-7-2 13:03:30', 'history'],
]
df = pd.DataFrame(data)
df.columns = ['user_id', 'time', 'event']
df['time'] = pd.to_datetime(df['time'])
df['dummy'] = 1
df
user_id time event dummy
0 user1 2015-07-01 10:00:00 login 1
1 user1 2015-07-01 10:00:10 item 1
2 user1 2015-07-01 10:00:30 item 1
3 user2 2015-07-01 10:01:00 top 1
4 user1 2015-07-01 10:01:30 cart 1
5 user2 2015-07-01 10:01:50 login 1
6 user2 2015-07-01 10:02:30 logout 1
7 user1 2015-07-02 13:00:00 login 1
8 user1 2015-07-02 13:01:00 logout 1
9 user3 2015-07-02 13:01:00 top 1
10 user2 2015-07-02 13:01:50 login 1
11 user2 2015-07-02 13:02:30 item 1
12 user2 2015-07-02 13:03:30 cart 1
13 user2 2015-07-02 13:03:30 history 1

Supposons que vous souhaitiez mettre en forme ces données sous la forme "1 utilisateur, 1 ligne" et "le nombre total d'occurrences pour chaque événement quotidien" sous forme de colonne.

pivot_table et Grouper

Vous pouvez utiliser la classe DataFrame pivot_table () pour faire quelque chose de similaire à un tableau croisé dynamique Excel. Je voudrais agréger par jour, mais si vous utilisez Grouper (), vous pouvez bien grouper les colonnes de type datetime. Comme c'est pratique ...

res2 = df.pivot_table(index=['user_id', pd.Grouper(freq='d', key='time')], columns='event', values='dummy', aggfunc=len)
res2
event cart history item login logout top
user_id time
user1 2015-07-01 1 NaN 2 1 NaN NaN
2015-07-02 NaN NaN NaN 1 1 NaN
user2 2015-07-01 NaN NaN NaN 1 1 1
2015-07-02 1 1 1 1 NaN NaN
user3 2015-07-02 NaN NaN NaN NaN NaN 1

Puisque le freq = 'd' de Grouper, il sera agrégé quotidiennement. Si vous définissez freq = 'M', ce sera mensuel.

Apportez la date dans la colonne

Il est bon d'utiliser unstack ().

res3 = res2.unstack()
res3
event cart history item login logout top
time 2015-07-01 2015-07-02 2015-07-01 2015-07-02 2015-07-01 2015-07-02 2015-07-01 2015-07-02 2015-07-01 2015-07-02 2015-07-01 2015-07-02
user_id
user1 1 NaN NaN NaN 2 NaN 1 1 NaN 1 NaN NaN
user2 NaN 1 NaN 1 NaN 1 1 1 1 NaN 1 NaN
user3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1

Je veux mettre la date

Utilisez swaplevel (Index1, que vous souhaitez remplacer). Aussi, je veux opérer sur la colonne (axe numéro 1), donc ajoutez ʻaxis = 1`.

res4 = res3.swaplevel(0, 1, axis=1)
res4
time 2015-07-01 2015-07-02 2015-07-01 2015-07-02 2015-07-01 2015-07-02 2015-07-01 2015-07-02 2015-07-01 2015-07-02 2015-07-01 2015-07-02
event cart cart history history item item login login logout logout top top
user_id
user1 1 NaN NaN NaN 2 NaN 1 1 NaN 1 NaN NaN
user2 NaN 1 NaN 1 NaN 1 1 1 1 NaN 1 NaN
user3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1

Je veux que les colonnes soient classées par ordre chronologique

Utilisez sortlevel ().

res4.sortlevel(0, axis=1)
time 2015-07-01 2015-07-02
event cart history item login logout top cart history item login logout top
user_id
user1 1 NaN 2 1 NaN NaN NaN NaN NaN 1 1 NaN
user2 NaN NaN NaN 1 1 1 1 1 1 1 NaN NaN
user3 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1

Vous pouvez maintenant lui donner la forme souhaitée.

à la fin

Il y aura une colonne «Nombre de types d'événements x Nombre de dates», donc s'il y en a trop, il ne peut pas être utilisé. Je pense qu'il peut être utilisé lorsque le nombre de types d'événements n'est pas important ou lorsqu'il est agrégé sur une base mensuelle.

Quoi qu'il en soit, les pandas sont pratiques

Recommended Posts

Agréger les données d'événement dans un format un seul utilisateur sur une ligne à l'aide de pandas
Analyse de données à l'aide de pandas python
Méthode de visualisation de données utilisant matplotlib (+ pandas) (5)
Analyser les données au format CSV à l'aide de SQL
Méthode de visualisation de données utilisant matplotlib (+ pandas) (3)
Méthode de visualisation de données utilisant matplotlib (+ pandas) (4)
Essayez d'agréger les données de musique doujin avec des pandas
[Pandas] Principes de base du traitement des données de date à l'aide de dt
100 langage de traitement knock-20 (à l'aide de pandas): lecture de données JSON
Convertir les données au format json en txt (en utilisant yolo)
Transformez les données de vacances en une trame de données avec les pandas