[PYTHON]

Der unten angezeigte Code lautet

import pandas as pd

Es wird unter der Voraussetzung geschrieben, dass es getan wird. Außerdem ist die eingefügte Tabelle eine Kopie der Version "to_html", sodass sie sich geringfügig von der Anzeige auf dem Jupiter-Notizbuch unterscheidet.

Was ist MultiIndex?

MultiIndex / Advanced Indexing Eine Funktion zum Indizieren mehrerer Spalten mit DataFrame von Pandas. Dies ist nützlich, wenn mehrere Werte als Schlüssel verwendet werden, um die Daten eindeutig zu identifizieren.

Daten vorbereiten und normale Indizes überprüfen

Normale Indizes werden in diesem Artikel der Einfachheit halber im Gegensatz zum Multi-Index als Einzelindex bezeichnet. (Es gibt keinen solchen Typ)

Datenaufbereitung

Bereiten Sie die folgende CSV zur Erklärung vor

sample.csv


name,year,product,expected,actual
Taro,2013,A,116,119
Taro,2013,B,131,149
Taro,2014,A,151,124
Taro,2014,B,125,107
Taro,2015,A,135,109
Taro,2015,B,142,148
Hanako,2013,A,170,130
Hanako,2013,B,113,190
Hanako,2014,A,102,142
Hanako,2014,B,183,125
Hanako,2015,A,169,120
Hanako,2015,B,134,199

Lesen Sie dies mit Pandas.

df1 = pd.read_csv('sample.csv')
name year product expected actual
0 Taro 2013 A 116 119
1 Taro 2013 B 131 149
2 Taro 2014 A 151 124
3 Taro 2014 B 125 107
4 Taro 2015 A 135 109
5 Taro 2015 B 142 148
6 Hanako 2013 A 170 130
7 Hanako 2013 B 113 190
8 Hanako 2014 A 102 142
9 Hanako 2014 B 183 125
10 Hanako 2015 A 169 120
11 Hanako 2015 B 134 199

Die Zeilenbeschriftungen dieser Tabelle, "0,1,2 ...", sind "data.index", und die Spaltenbeschriftungen ", name", "year", ... "sind" data.columns ". Hat auch einen Datentyp von "pandas.Index".

Weil pandas.Index ein Mitglied namens name hat

df1.index.name = "id"
df1.columns.name = "header"

Dann

header name year product expected actual
id
0 Taro 2013 A 116 119
1 Taro 2013 B 131 149
2 Taro 2014 A 151 124
3 Taro 2014 B 125 107
4 Taro 2015 A 135 109
5 Taro 2015 B 142 148
6 Hanako 2013 A 170 130
7 Hanako 2013 B 113 190
8 Hanako 2014 A 102 142
9 Hanako 2014 B 183 125
10 Hanako 2015 A 169 120
11 Hanako 2015 B 134 199
Es wird so ein Tisch sein.

Datenauswahl

df1["name"]

Ausgabe


id
0       Taro
1       Taro
2       Taro
3       Taro
4       Taro
5       Taro
6     Hanako
7     Hanako
8     Hanako
9     Hanako
10    Hanako
11    Hanako
Name: name, dtype: object
df1.loc[3]

Ausgabe


header
name        Taro
year        2014
product        B
expected     125
actual       107
Name: 3, dtype: object
df1.iloc[3]

Dieser Zeitindex ist ein Zeilenindex, daher ist die Ausgabe dieselbe.

df1.ix[3:5,"product":"actual"]

Ausgabe

product expected actual
3 B 125 107
4 A 135 109
5 B 142 148
df1[(df1["name"] == "Hanako")&(df1["product"] == "A")]

Ausgabe

header name year product expected actual
id
6 Hanako 2013 A 170 130
8 Hanako 2014 A 102 142
10 Hanako 2015 A 169 120

Weitere Informationen finden Sie in anderen Artikeln und Büchern.

MultiIndex-Einstellungen

Das Hauptthema ist von hier. Wie Sie sehen können, die Daten, die Sie gerade gelesen haben

Verwenden Sie in einem solchen Fall MultiIndex, um die Daten übersichtlich zu organisieren.

df2 = pd.read_csv("sample.csv",index_col=["name","year","product"])
expected actual
name year product
Taro 2013 A 116 119
B 131 149
2014 A 151 124
B 125 107
2015 A 135 109
B 142 148
Hanako 2013 A 170 130
B 113 190
2014 A 102 142
B 183 125
2015 A 169 120
B 134 199

Nach dem Lesen der Daten oder beim Anwenden von MultiIndex auf den durch verschiedene Verarbeitungen erstellten DataFrame 2016/3/18 postscript </ font> Wenn Sie die Funktion set_index verwenden, wird die angegebene Spalte indiziert. (Ich wusste das nicht, weil es nicht auf der MultiIndex-Seite des offiziellen Dokuments aufgeführt war ...)

df2 = df1.set_index(["name","year","product"], drop=True)

Wenn drop = True, wird die indizierte Spalte gelöscht. Bei der Rückkehr

df1 = df2.reset_index()

Zu Ende des Hinzufügens </ font>

pd.MultiIndex.from_arrays()
pd.MultiIndex.from_product()
pd.MultiIndex.from_tuples()

Wenn Sie in der Nähe verwenden, ist es überschaubar. Übrigens erstellt pd.MultiIndex.from_product einen Index für verschachtelte Schleifen, wenn mehrere Sammlungen übergeben werden (wie itertools.product). Zum Beispiel, um denselben Index wie "df2" zu erstellen

pd.MultiIndex.from_product((["Taro","Hanako"],[2013,2014,2015],["A","B"]),\
    names=["name","year","product"])

Du kannst es schaffen.

Datenauswahl

Übergeben Sie bei der Auswahl einer Zeile das Index-Taple.

df2.loc[("Taro",2013,"A")]

Ausgabe


expected    116
actual      119
Name: (Taro, 2013, A), dtype: int64

Wenn Sie einen Taple auf halbem Weg passieren, wird die Tabelle zurückgegeben. Da jedoch PerformanceWarning für die Spezifikation bis zur mittleren Ebene ausgegeben wird, ist es besser, sie nur zu verwenden, wenn Sie vorübergehend nach innen schauen möchten. Es ist kein Problem, wenn Sie die erste Ebene (in diesem Fall den Namen) oder alle Ebenen angeben.

df2.loc[("Taro",2013)]

Ausgabe (PerformanceWarning)

expected actual
product
A 116 119
B 131 149

Verwenden Sie "xs", um bis zur mittleren Ebene oder nur in der Mitte anzugeben

df2.xs(["Taro","A"],level=[0,2])

Ausgabe

expected actual
year
2013 116 119
2014 151 124
2015 135 109

Die Warnung wird nicht mehr angezeigt, aber selbst wenn Sie den gleichen Vorgang wie oben schreiben, ist dieser etwas langsamer ...

Verwendung von MultiIndex

Da pandas.Index nicht pandas.Series ist, kann es nicht wie eine normale Zeile verwendet werden und ist nüchtern und stressig. Dann möchte ich sagen, dass es in Ordnung ist, den einzelnen Index und die Serie beizubehalten, aber da es viel Aufwand gibt, überlegen Sie, wo Sie ihn verwenden sollen.

Suchen Sie nach eindeutig bestimmten Daten, indem Sie mehrere Spalten als Schlüssel verwenden

Wie ich bereits geschrieben habe, ist dies wahrscheinlich die Hauptverwendung.

df2.loc[("Taro",2013,"A")]

Wenn Sie versuchen, dasselbe mit Single Index zu tun,

df1[(df1["name"] == "Taro")&(df1["year"] == 2013)&(df1["product"] == "A")].iloc[0]

Es fühlt sich schmutzig an (vielleicht gibt es einen besseren Weg, es zu schreiben). Natürlich gibt es auch einen Geschwindigkeitsunterschied. Als ich versuchte, ungefähr 50.000 Daten zu verwenden, stellte ich fest, dass es in einem Versuch nur einen 2-3-fachen Unterschied gab. Ich habe versucht, mit "%% timeit" zu überprüfen, aber "df2" scheint zwischengespeichert zu sein und ich konnte es nicht vergleichen.

Wenn Sie nicht sicher sind, ob Daten vorhanden sind, die dem angegebenen Schlüssel MultiIndex entsprechen

("Taro",2013,"A") in df2.index

Aber mit Single Index

df1[(df1["name"] == "Taro")&(df1["year"] == 2013)&(df1["product"] == "A")].shape[0]>0

Ich muss es tun (vielleicht gibt es einen besseren Weg, es zu schreiben)

Zur Ausstellung

Da die Ausgabe von MultiIndex mit verschachtelten Schlüsselindizes für Menschen gut sichtbar ist, kann MultiIndex nur für die Ausgabe verwendet werden. DataFrame kann in vielen Formaten wie HTML, Excel, Latex usw. ausgegeben werden. Selbst wenn es sich um Excel handelt, werden die Zellen gemäß MultiIndex ordnungsgemäß kombiniert, sodass dies praktisch ist. Übrigens, mit df.to_csv werden alle Zeilen korrekt ausgegeben, auch wenn es sich um MultiIndex handelt.

Andere Betriebsmethoden usw.

  • Verwenden Sie df.index.get_level_values, um eine Indexebene abzurufen
  • Verwenden Sie df.reset_index (), um MultiIndex an SingleIndex zurückzugeben. Eine Spalte für jede Ebene wird hinzugefügt, um einen DataFrame zu erstellen, dessen Seriennummer der Index ist.
  • Außerdem gibt es Scheiben usw., aber ich weiß nicht, wie ich sie verwenden soll, also werde ich eine andere Gelegenheit nutzen

Recommended Posts