2016-05-16 7 views
0

ich einen Datenrahmen, die wie folgt zusammengefasst worden:Complex GROUPBY oder Pivot-Tabelle Berechnung in Python Pandas

UNIT CA DATE  SCP  TIME  LABEL  VALUES1  VALUES2   
R001 A058 08-01-13 01-00-00 01:00:00 REGULAR 340751.000 194975.000 
          05:00:00 REGULAR 340753.000 194975.000 
          09:00:00 REGULAR 341251.000 194984.000 
          09:39:56 REGULAR 341440.000 194994.000 
          13:00:00 REGULAR 341808.000 195061.000 
          17:00:00 REGULAR 342030.000 195295.000 
          21:00:00 REGULAR 342214.000 195659.000 
        01-00-01 01:00:00 REGULAR 245262.000 221709.000 
          05:00:00 REGULAR 245262.000 221709.000 
          09:00:00 REGULAR 245428.000 221742.000 
          09:39:56 REGULAR 245508.000 221754.000 
          13:00:00 REGULAR 245620.000 221856.000 
          17:00:00 REGULAR 245679.000 222178.000 
          21:00:00 REGULAR 245743.000 222604.000 

ich die Maximal- und Minimalwerte für VALUE1 und VALUE2 für jeden SCP berechnet man die Differenz extrahieren und zurück in das folgende Format:

UNIT CA DATE  SCP  DIFF OF MAX - MIN VALUE1 DIFF OF MAX - MIN VALUE2   
R001 A058 08-01-13 01-00-00  ....       .... 
        01-00-01  ....       .... 

Ich kann nicht herausfinden, wie es geht. Ich glaube, dass es einen Weg geben muss, es mit groupby oder pivot_table zu machen.

Vielen Dank im Voraus.

Antwort

2

IIUC, .groupby() auf level sollte funktionieren. Beginnend mit Beispieldaten:

df.set_index(['UNIT', 'CA', 'DATE', 'SCP'], inplace=True) 

<class 'pandas.core.frame.DataFrame'> 
MultiIndex: 14 entries, (R001, A058, 2013-08-01 00:00:00, 01-00-00) to (R001, A058, 2013-08-01 00:00:00, 01-00-01) 
Data columns (total 4 columns): 
TIME  14 non-null object 
LABEL  14 non-null object 
VALUES1 14 non-null int64 
VALUES2 14 non-null int64 
dtypes: int64(2), object(2) 

            TIME LABEL VALUES1 VALUES2 
UNIT CA DATE  SCP           
R001 A058 2013-08-01 01-00-00 01:00:00 REGULAR 340751 194975 
        01-00-00 05:00:00 REGULAR 340753 194975 
        01-00-00 09:00:00 REGULAR 341251 194984 
        01-00-00 09:39:56 REGULAR 341440 194994 
        01-00-00 13:00:00 REGULAR 341808 195061 
        01-00-00 17:00:00 REGULAR 342030 195295 
        01-00-00 21:00:00 REGULAR 342214 195659 
        01-00-01 01:00:00 REGULAR 245262 221709 
        01-00-01 05:00:00 REGULAR 245262 221709 
        01-00-01 09:00:00 REGULAR 245428 221742 
        01-00-01 09:39:56 REGULAR 245508 221754 
        01-00-01 13:00:00 REGULAR 245620 221856 
        01-00-01 17:00:00 REGULAR 245679 222178 
        01-00-01 21:00:00 REGULAR 245743 222604 

Gruppe auf den MultiIndex Ebenen, und wenden Sie die Differenz von max() und min() für jede der zwei Spalten:

df.groupby(level=['UNIT', 'CA', 'DATE', 'SCP'])['VALUES1', 'VALUES2'].apply(lambda x: x.max()-x.min()) 

           VALUES1 VALUES2 
UNIT CA DATE  SCP      
R001 A058 2013-08-01 01-00-00  1463  684 
        01-00-01  481  895 
+0

Siehe Antwort aktualisiert. – Stefan

+0

Wie erstellen Sie den Multi-Index? Ich habe versucht, die Dokumentation der Pandas zu lesen, ist mir aber nicht klar. Nicht viel um das Internet herum. Vielen Dank. – Windstorm1981

+1

Sie müssen nur mehrere Spalten als Index setzen - siehe Zeile am Anfang des Beispielcodes: 'df.set_index (['UNIT', 'CA', 'DATUM', 'SCP'], inplace = True)'. Wenn Sie sortieren wollen, gibt es 'df.sortlevel()'. – Stefan