2017-02-26 8 views
1

verwenden würde Ich mag den folgenden Datenrahmen nach Verschwenken den Datenrahmen (Logging von einer Simulation) der Teilmenge:Subsetting auf pandas Datenrahmen nach pivot_table

import pandas as pd 

df = pd.DataFrame(
     {'runid' : [26 , 26 , 26 , 26 , 26 , 26 , 27 , 27 , 27 , 27 , 27 , 27 ], 
     'time' : [0 , 1 , 1 , 3 , 5 , 7 , 0 , 0 , 0 , 2 , 4 , 5 ], 
     'process': ['p1', 'p2', 'p2', 'p1', 'p1', 'p2', 'p1', 'p1', 'p2', 'p2', 'p2', 'p1'], 
     'state' : ['a' , 'a' , 'b' , 'b' , 'c' , 'c' , 'a' , 'b' , 'a' , 'b' , 'c' , 'c' ] 
     }) 

dann den Datenrahmen schwenkt:

data = pd.pivot_table(df, index=['runid', 'process'], columns=['state'], values=['time']) 

Ausgabe:

   time  
state   a b c 
runid process   
26 p1   0 3 5 
     p2   1 1 7 
27 p1   0 0 5 
     p2   0 2 4 

Wie mache ich nach t diesen geschwenkten DataFrame, so dass runid 26 und die Spalten a und b ausgewählt werden (so dass ich a von b für alle Prozesse mit runid 26 subtrahieren und diese Werte für die Analyse speichern kann).

Antwort

1

Sie könnten das Objekt pd.IndexSlice verwenden, um die Syntax ein wenig schöner zu machen, dann nur loc.

>>> idx = pd.IndexSlice 
>>> data.loc[idx[26, :], idx[:, ['a', 'b']]] 

       time 
state   a b 
runid process   
26 p1   0 3 
     p2   1 1 
+0

Vielen Dank! Und wie füge ich zu dieser Untermenge eine Zusatzspalte 'bminusa' hinzu mit dem Wert von b minus a? – Rene

+0

@Rene 'sub_df.time.b - sub_df.time.a'? Sie sollten sich den Abschnitt [MultiIndex/Erweiterte Indexierung] (http://pandas.pydata.org/pandas-docs/stable/advanced.html) der Dokumentation ansehen. – miradulo

Verwandte Themen