2014-11-25 6 views
13

Was genau ist die lexsort_depth eines Multi-Index-Datenrahmens? Warum muss es für die Indexierung sortiert werden?Was genau ist die lexsort_depth eines Multi-Index-Dataframe?

Zum Beispiel habe ich festgestellt, dass nach manuell einen Multi-Index-Datenrahmen df mit Säulen Gebäude in drei Ebenen organisiert, wenn ich versuche zu tun:

idx = pd.IndexSlice 
df[idx['foo', 'bar']] 

ich:

KeyError: 'Key length (2) was greater than MultiIndex lexsort depth (0)' 

und an diesem Punkt, df.columns.lexsort_depth ist 0

, jedoch, wenn ich, wie empfohlen here und here:

df = df.sortlevel(0,axis=1) 

dann die Querschnitts Indizierung funktioniert. Warum? Was genau ist lexsort_depth, und warum Sortierung mit sortlevel diese Art der Indexierung behebt?

Antwort

11

lexsort_depth ist die Anzahl der Ebenen eines Multi-Index, die lexikalisch sortiert sind. Das heißt, in einer a-b-c-1-2-3-Reihenfolge (normale Sortierreihenfolge).

So Element Indizierung wird Arbeit, wenn ein Multi-Index nicht sortiert ist, aber die Lookups können durchaus etwas langsamer sein (in 0.15.2, wird dies ein PerformanceWarning zeigt diese Art von Lookups zu tun, siehe here

unabhängig für die Ebene

der Grund, dass in der Regel eine gute Idee, das Sortieren ist, dass Pandas der Lage ist, um herauszufinden, Hash-basierte Indizierung zu verwenden, wo die Lage in einem bestimmten Niveau ist,. dann können Sie diese Indexer zu verwenden, das Finale zu finden Standorte.

Pandas nutzt np.searchsorted diese Orte zu finden, wenn seine sortiert. Wenn es nicht sortiert, dann muss man auf verschiedene (langsamere) Methoden zurückgreifen.

here ist der Code, der dies tut.