Hierarchische Indexierung (auch als "Multi-Level" Indizierung bezeichnet) wurde in der Pandas 0.4 Release eingeführt.
Dies öffnet die Tür zu einigen recht anspruchsvollen Datenanalyse und -manipulation, insbesondere für die Arbeit mit höher dimensionalen Daten. Im Wesentlichen ermöglicht es Ihnen, beliebig hohe Dimensionsdaten in einer zweidimensionalen Tabellenstruktur (DataFrame) zu speichern und zu manipulieren.
Stellen Sie sich einen Datenrahmen mit MultiIndex
wie diese Konstruktion: -
import pandas as pd
import numpy as np
np.arrays = [['one','one','one','two','two','two'],[1,2,3,1,2,3]]
df = pd.DataFrame(np.random.randn(6,2),index=pd.MultiIndex.from_tuples(list(zip(*np.arrays))),columns=['A','B'])
df # This is the dataframe we have generated
A B
one 1 -0.732470 -0.313871
2 -0.031109 -2.068794
3 1.520652 0.471764
two 1 -0.101713 -1.204458
2 0.958008 -0.455419
3 -0.191702 -0.915983
Diese df
ist einfach eine Datenstruktur von zwei Dimensionen
df.ndim
2
Aber wir können es sich vorstellen, am Ausgang suchen, wie eine dreidimensionale Datenstruktur.
one
mit 1
mit Daten -0.732470 -0.313871
.
one
mit 2
mit Daten -0.031109 -2.068794
.
one
mit 3
mit Daten 1.520652 0.471764
.
A.k.a .: „effektiv speichern und in einem 2-dimensionalen Tabellenstruktur beliebig hohe Dimensionsdaten manipulieren“
Dies ist nicht nur eine „hübsche Anzeige“. Es hat den Vorteil, dass Daten leicht abgerufen werden können, da wir jetzt einen hierarchischen Index haben.
Zum Beispiel.
In [44]: df.ix["one"]
Out[44]:
A B
1 -0.732470 -0.313871
2 -0.031109 -2.068794
3 1.520652 0.471764
wird uns einen neuen Datenrahmen nur für die Gruppe von Daten geben, die zu "eins" gehören.
Und wir können unsere Daten Auswahl weiter eingrenzen, indem Sie diese: -
In [45]: df.ix["one"].ix[1]
Out[45]:
A -0.732470
B -0.313871
Name: 1
Und natürlich, wenn wir einen bestimmten Wert wollen, hier ein Beispiel: -
In [46]: df.ix["one"].ix[1]["A"]
Out[46]: -0.73247029752040727
Also, wenn Wir haben noch mehr Indizes (neben den 2 Indizes, die im obigen Beispiel gezeigt werden), können wir im Wesentlichen den Datensatz, den wir wirklich interessieren, aufreißen und auswählen, ohne groupby
zu benötigen.
Wir können sogar einen Querschnitt (Zeilen oder Spalten) aus unserem Datenrahmen greifen ...
durch Reihen: -
In [47]: df.xs('one')
Out[47]:
A B
1 -0.732470 -0.313871
2 -0.031109 -2.068794
3 1.520652 0.471764
durch Säulen: -
In [48]: df.xs('B', axis=1)
Out[48]:
one 1 -0.313871
2 -2.068794
3 0.471764
two 1 -1.204458
2 -0.455419
3 -0.915983
Name: B
Die 3 Paare von Daten in dem ersten Beschreibung der 3-dimensionalen Datenstruktur ('eines mit 1 mit Daten -0,790620 0,229276 . '...) scheinen in Ihrem tatsächlichen Beispiel keinen Daten zu entsprechen. – Gerrat
Gibt es einen bestimmten Grund, MultiIndex.from_tuples (list (zip (* np.arrays)) zu verwenden, wenn die Methode from_arrays verfügbar ist? df = pd.DataFrame (np.random.randn (6,2), index = pd.MultiIndex.from_arrays (np.arrays), Spalten = ['A', 'B']) –