Angenommen, ich habe ein Protokoll der Benutzeraktivität und möchte einen Bericht über die Gesamtdauer und die Anzahl der eindeutigen Benutzer pro Tag erstellen.
import numpy as np
import pandas as pd
df = pd.DataFrame({'date': ['2013-04-01','2013-04-01','2013-04-01','2013-04-02', '2013-04-02'],
'user_id': ['0001', '0001', '0002', '0002', '0002'],
'duration': [30, 15, 20, 15, 30]})
Die Gesamtdauer ist ziemlich einfach:
group = df.groupby('date')
agg = group.aggregate({'duration': np.sum})
agg
duration
date
2013-04-01 65
2013-04-02 45
Ich möchte die Dauer und die Anzahl der Unterscheidungsmerkmale gleichzeitig summieren, aber ich kann anscheinend kein Äquivalent für count_distinct finden:
agg = group.aggregate({ 'duration': np.sum, 'user_id': count_distinct})
Das funktioniert, aber es gibt doch einen besseren Weg, oder?
group = df.groupby('date')
agg = group.aggregate({'duration': np.sum})
agg['uv'] = df.groupby('date').user_id.nunique()
agg
duration uv
date
2013-04-01 65 2
2013-04-02 45 1
Ich denke, ich muss nur eine Funktion bereitstellen, die die Anzahl der verschiedenen Elemente eines Series-Objekts an die Aggregatfunktion zurückgibt, aber ich habe nicht viel Kontakt mit den verschiedenen Bibliotheken, die mir zur Verfügung stehen. Es scheint auch, dass das groupby-Objekt diese Informationen bereits kennt. Würde ich also nicht einfach den Aufwand duplizieren?
nunique
direkt verwenden. Siehe @Blodwyn Pigs Lösung unten'nunique' ist eine Option für .agg () seit pandas 0.20.0, also:
quelle
duration: np.unique
df.groupby('date').agg({'user_id': lambda s: s.unique().reset_index(drop=True)})
Wenn man nur die bereits gegebenen Antworten hinzufügt,
"nunique"
scheint die Lösung mit der Zeichenfolge viel schneller zu sein. Sie wurde hier in einem Datenrahmen mit ~ 21 Millionen Zeilen getestet und dann in ~ 2 Millionen gruppiertquelle