Dieses Beispiel sollte Sie für Ihre Aufgabe in die richtige Richtung bringen.
Zuerst Ich erstelle eine Datenrahmen ähnlich den man in der Frage zeigen:
import pandas as pd
import numpy as np
import datetime as dt
orders = pd.DataFrame({
'client': np.random.randint(65, 70, size=15),
'date': np.random.randint(0, 30, size=15)})
orders.client = orders.client.apply(chr)
orders.date = orders.date.apply(
pd.to_datetime, unit='d', origin=dt.date(2017, 1, 1), box=False)
# Sorting here is not necessary, just for visualization
orders.sort_values(['client', 'date'], inplace=True)
orders.reset_index(inplace=True, drop=True)
orders.head()
>>>>
client date
0 A 2017-01-27
1 A 2017-01-29
2 A 2017-01-30
3 B 2017-01-03
4 B 2017-01-13
Der Schlüssel zur Lösung ist in der Linie orders.groupby('client').date.apply(pd.Series.sort_values).diff()
.
Zuerst verwenden wir groupby
gruppiert die Aufträge client
als Schlüssel verwenden, dann wählen wir die date
Spalt nur und sortieren die Daten in jeder Gruppe mit pd.Series.sort_values
schließlich wir diff
verwenden, um die Differenz jeden Datensatz mit dem folgenden zu berechnen (Hier ist, warum die Daten in jeder Gruppe sortiert werden müssen).
Der Rest des Codes dient lediglich zur Visualisierung des Ergebnisses, d. H. Umbenennung der Serie, die Sie erhalten, und Verkettung mit dem ursprünglichen DataFrame.
diff_df = pd.concat([
orders,
orders.groupby('client').date.diff().rename('diff')], axis=1)
diff_df.head(10)
>>>>
client date diff
0 A 2017-01-27 NaT
1 A 2017-01-29 2 days
2 A 2017-01-30 1 days
3 B 2017-01-03 NaT
4 B 2017-01-13 10 days
5 B 2017-01-18 5 days
6 B 2017-01-24 6 days
7 C 2017-01-01 NaT
8 C 2017-01-02 1 days
9 C 2017-01-03 1 days
Sobald Sie die Zeitunterschiede haben, können Sie alle Arten von In-Group-Metriken berechnen, die Sie benötigen.
Zuerst kann man pd.Series.describe
versuchen:
diff_df.groupby('client').diff.describe()
>>>>
count mean std min \
client
A 1 5 days 00:00:00 NaT 5 days 00:00:00
B 1 12 days 00:00:00 NaT 12 days 00:00:00
C 3 4 days 00:00:00 1 days 17:34:09.189773 2 days 00:00:00
D 1 4 days 00:00:00 NaT 4 days 00:00:00
E 4 5 days 00:00:00 3 days 03:53:40.789838 2 days 00:00:00
25% 50% 75% max
client
A 5 days 00:00:00 5 days 00:00:00 5 days 00:00:00 5 days 00:00:00
B 12 days 00:00:00 12 days 00:00:00 12 days 00:00:00 12 days 00:00:00
C 3 days 12:00:00 5 days 00:00:00 5 days 00:00:00 5 days 00:00:00
D 4 days 00:00:00 4 days 00:00:00 4 days 00:00:00 4 days 00:00:00
E 2 days 18:00:00 4 days 12:00:00 6 days 18:00:00 9 days 00:00:00
Wenn das nicht genug ist, können Sie Ihre eigenen aggregations definieren.
Sie eine Liste der Funktionen benötigen, wenn Sie auf einer einzigen Serie arbeiten:
metrics = [pd.Series.count, pd.Series.min, pd.Series.max, pd.Series.mean]
diff_df.groupby('client').diff.aggregate(metrics)
>>>>
count nunique min max mean
client
A 1 1 5 days 5 days 5 days
B 1 1 12 days 12 days 12 days
C 3 2 2 days 5 days 4 days
D 1 1 4 days 4 days 4 days
E 4 4 2 days 9 days 5 days
oder ein Wörterbuch der von {column -> function, column -> function_list}
, wenn Sie auf dem gesamten Datenrahmen arbeiten:
metrics = {
'date': [pd.Series.count, pd.Series.nunique],
'diff': [pd.Series.min, pd.Series.max, pd.Series.mean],
}
diff_df.groupby('client').aggregate(metrics)
>>>>
diff date
min max mean count nunique
client
A 5 days 5 days 5 days 2 2
B 12 days 12 days 12 days 2 2
C 2 days 5 days 4 days 4 4
D 4 days 4 days 4 days 2 2
E 2 days 9 days 5 days 5 5
Das ist wie ein fühlt Zuordnung. Bitte machen Sie einen ernsthaften Versuch und kehren Sie mit Problemen im Code zurück. – Parfait