[PYTHON] Aggregieren Sie Ereignisdaten mithilfe von Pandas in einem einzeiligen Ein-Benutzer-Format

Einführung

Dieses Mal bedeutet das Wort "Ereignisdaten" Daten wie ** (Zeit, Ereignisname (, Benutzer) (, Menge)) **. Wenn Sie versuchen, ein Benutzervorhersagemodell zu erstellen, möchten Sie diese Ereignisdaten möglicherweise so formatieren, dass sie "ein Benutzer, eine Zeile" sind.

Notieren Sie sich, wie Pandas mit diesem Bereich umgehen.

Methode

Betrachten Sie zunächst die folgenden Ereignisdaten als Beispiel.

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

Angenommen, Sie möchten diese Daten als "1 Benutzer, 1 Zeile" und "die Gesamtzahl der Vorkommen für jedes tägliche Ereignis" als Spalte formatieren.

pivot_table und Grouper

Sie können die DataFrame-Klasse pivot_table () verwenden, um etwas Ähnliches wie eine Excel-Pivot-Tabelle zu tun. Ich möchte nach Tag aggregieren, aber wenn Sie Grouper () verwenden, können Sie die Spalten vom Typ datetime gut gruppieren. Wie praktisch ...

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

Da Groupers "freq =" d "ist, wird es täglich aggregiert. Wenn Sie freq = 'M' setzen, wird es monatlich sein.

Bringen Sie das Datum in die Spalte

Es ist gut, unstack () zu verwenden.

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

Ich möchte das Datum ansprechen

Verwenden Sie swaplevel (Index1, den Sie ersetzen möchten). Außerdem möchte ich die Spalte (Achsnummer 1) bearbeiten, also füge "Achse = 1" hinzu.

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

Ich möchte, dass die Spalten in chronologischer Reihenfolge angeordnet sind

Verwenden Sie 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

Jetzt können Sie es in die gewünschte Form bringen.

schließlich

Es wird eine Spalte mit "Anzahl der Ereignistypen x Anzahl der Daten" angezeigt. Wenn also zu viele vorhanden sind, kann diese nicht verwendet werden. Ich denke, dass es verwendet werden kann, wenn die Anzahl der Ereignistypen nicht groß ist oder wenn es monatlich aggregiert wird.

Wie auch immer, Pandas sind praktisch

Recommended Posts

Aggregieren Sie Ereignisdaten mithilfe von Pandas in einem einzeiligen Ein-Benutzer-Format
Datenanalyse mit Python-Pandas
Datenvisualisierungsmethode mit Matplotlib (+ Pandas) (5)
Analysieren Sie Daten im CSV-Format mit SQL
Datenvisualisierungsmethode mit Matplotlib (+ Pandas) (3)
Datenvisualisierungsmethode mit Matplotlib (+ Pandas) (4)
Versuchen Sie, Doujin-Musikdaten mit Pandas zu aggregieren
[Pandas] Grundlagen der Verarbeitung von Datumsdaten mit dt
100 Sprachverarbeitung Knock-20 (unter Verwendung von Pandas): Lesen von JSON-Daten
Konvertieren Sie Daten im JSON-Format in txt (mit yolo)
Machen Sie Urlaubsdaten mit Pandas zu einem Datenrahmen