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