2017-06-09 4 views
1

Ich versuche SQL-style Abfrage auf einem Pandas hierarchischen Index-Datenrahmen zu tun. Der Level (0) Index ist 'Übung' und Level (1) ist 'Datum' ein DatumZeitpunkt. Ich kann glücklich schneiden, wenn ich einen Wert für den Index der Ebene (o) vorschlage.Slicing inneren Index eines Pandas Hierarchischen Index wirft einen Schlüsselfehler

Druck gbed.loc [ 'Bank', pd.to_datetime ('2011-01-03')]

aber wenn ich versuche, einen Doppelpunkt zu verwenden "alle Zeilen" für die darstellen Ebene (0) Index, schlägt die Scheibe mit einem KeyError auf der Ebene (1)

# KeyError: 'the label [2011-01-03 00:00:00] is not in the [columns]' 
print gbed.loc[:, pd.to_datetime('2011-01-03')] 

das Visualizing Pandas Buch legt nahe, diese Innen-Indizierung möglich ist in einigen Fällen aber ich kann nicht herausfinden, wann/warum es funktioniert nicht.

Selection is even possible in some cases from an “inner” level: 
In [267]: data[:, 2] 
Out[267]: 
a 0.852965 

Von Seite 147 von 'Python for Data Analysis'

Am mich gefragt, ob ich die Scheibe falsch im letzten Fall der Angabe? Der Beispielcode ist unten.

import pandas as pd 
#make an index with a handful of duplicate dates 
dates1 = pd.date_range('1/1/2011', periods=8, freq='D') 
dates2 = pd.date_range('1/1/2011', periods=4, freq='D') 
dates = dates1.append(dates2) 

ex = ['Squat','Squat','Squat','Squat','Squat','Squat','Squat','Squat','Bench','Bench','Bench','Bench',] 
wt = [100,120,140,150,150,140,160,172,90,90,100,110] 
cols = {'Exercise': ex, 'Weight': wt, 'Date': dates} 

sf = pd.DataFrame(cols) 

gbed = sf.groupby(['Exercise','Date']).max() 
print gbed 

#These two work: return rows for a specific exercise on 2011-01-03 
# SELECT * WHERE Exercise = 'Bench' AND Date = 2011-01-03 
print gbed.loc['Bench', pd.to_datetime('2011-01-03')] 
print gbed.loc['Squat', pd.to_datetime('2011-01-03')] 

#I am trying to return all rows that have a dated of '2011-01-03' 
# SELECT * WHERE Date = 2011-01-03 
# KeyError: 'the label [2011-01-03 00:00:00] is not in the [columns]' 
print gbed.loc[:, pd.to_datetime('2011-01-03')] 

Antwort

1

Zur Auswahl von MultiIndex Verwendung DataFrame.xs oder slicers, die für komplizierte Auswahl schön ist:

print (gbed.xs('2011-01-03', level=1, axis=0)) 
      Weight 
Exercise   
Bench  100 
Squat  140 

print (gbed.xs('2011-01-03', level=1, axis=0, drop_level=False)) 
        Weight 
Exercise Date    
Bench 2011-01-03  100 
Squat 2011-01-03  140 

idx = pd.IndexSlice 
print (gbed.loc[idx[:, '2011-01-03'], :]) 
        Weight 
Exercise Date    
Bench 2011-01-03  100 
Squat 2011-01-03  140 

idx = pd.IndexSlice 
print (gbed.loc[idx['Bench', '2011-01-03'], :]) 
        Weight 
Exercise Date    
Bench 2011-01-03  100 
Verwandte Themen