2017-07-26 9 views
0

Beispiele dafür, wie die df wie folgt aussehen: schätzen, wirklich jede Hilfe führen mich in der richtigen RichtungPython pandas groupby manipulation?

customer order_datetime 
a   01-03-2017 12:00:00 PM 
b   01-04-2017 12:00:00 PM 
c   01-07-2017 12:00:00 PM 
a   01-08-2017 12:00:00 PM 
b   01-09-2017 12:00:00 PM 
a   01-11-2017 12:00:00 PM 

Es gibt 2, was ich, aber ich bin immer noch im Lernprozesse erreichen wollte.

  • Erstellen Sie eine Liste der „Zeit zwischen den Aufträgen“, wo ich die min finden, bedeuten, max
  • wenn „Zeit zwischen Bestellung“ Finden Sie heraus, wird schneller/langsamer, dh Zeit zwischen order_3 und Order_2 gegen die Zeit zwischen order_2 und order_1
+0

Das ist wie ein fühlt Zuordnung. Bitte machen Sie einen ernsthaften Versuch und kehren Sie mit Problemen im Code zurück. – Parfait

Antwort

1

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