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.
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.
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.
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 |
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 |
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.
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