Scheibe pandas DataFrame durch MultiIndex Ebene oder Unterebene
Inspiriert von diese Antwort und der Mangel an eine einfache Antwort auf diese Frage ich fand mich schriftlich ein wenig syntaktischer Zucker, um das Leben einfacher zu filtern MultiIndex Ebene.
def _filter_series(x, level_name, filter_by):
"""
Filter a pd.Series or pd.DataFrame x by `filter_by` on the MultiIndex level
`level_name`
Uses `pd.Index.get_level_values()` in the background. `filter_by` is either
a string or an iterable.
"""
if isinstance(x, pd.Series) or isinstance(x, pd.DataFrame):
if type(filter_by) is str:
filter_by = [filter_by]
index = x.index.get_level_values(level_name).isin(filter_by)
return x[index]
else:
print "Not a pandas object"
Aber wenn ich weiß das die pandas development team (und ich fange an, langsam!) dort gibt es bereits einen schönen Weg, dies zu tun, und ich weiß einfach nicht, was es noch!
Habe ich Recht?
- Wenn Sie daran interessiert sind, mehr über das schneiden und filtern multiindex DataFrames, werfen Sie bitte einen Blick auf meine post: Wie kann ich die Scheibe oder filter MultiIndex DataFrame Ebenen?. Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich eigentlich von Ihnen positiv bewertet werden joris Antwort... aber leider ist das refactoring, die er erwähnt hat, nicht geschehen 0,14 und ist nicht passiert 0.17 weder. Also für den moment lassen Sie mich vorschlagen, eine quick-and-dirty-Lösung (natürlich abgeleitet von Jeff ist einer):
... als
wo
value
kann in der Tat ein einzelner Wert, sondern auch eine Liste, eine Scheibe...(ungetestet mit Platten und höhere dimension der Elemente, aber ich erwarte dass es funktioniert)
Dies ist sehr einfach mit der neuen multi-index SLICER im master/0.14 (Freigabe in Kürze) finden Sie hier
Es ist eine offene Frage, um diese syntatically einfacher (seine nicht schwer zu tun), siehe hier
e.g so etwas wie dieses:
df.loc[{ 'third' : ['C1','C3'] }]
ich denke, ist vernünftig,Hier ist, wie Sie es tun können (erfordert master/0.14):
Erstellen Sie ein indexer über alle Ebenen, der Auswahl von alle Einträge
Machen die wir uns interessieren nur die Einträge kümmern wir uns um
Wählen Sie es aus (es ist wichtig, dass dieses ist ein Tupel!)
df.loc[pd.IndexSlice[:, :, ['C1','C3'], :], :]
oderdf.loc(axis=0)[:,:,['C1','C3'], :]
df.loc[:, pd.IndexSlice[:, :, :, :, 'value']]
wo die ersten:
wäre ein Datum und ich möchte die Scheibe durch eine Reihe von Daten und nicht nur einen einzigen Tag.s.loc[pd.IndexSlice[:, :, ['C1','C3'], :]]
stattdf.loc[pd.IndexSlice[:, :, ['C1','C3'], :], :]
.Haben Sie die
- filter
Methode, können Dinge tun, wie diese. ZB mit dem Beispiel, dass gefragt wurde, in der verbunden ALSO Frage:Die filter-Methode ist umgestaltet im moment (in den kommenden 0.14), und eine
level
Schlüsselwort Hinzugefügt werden (da kannst du jetzt ein problem haben, wenn die gleichen Etiketten werden in verschiedenen Ebenen des index).