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.
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.
Normale Indizes werden in diesem Artikel der Einfachheit halber im Gegensatz zum Multi-Index als Einzelindex bezeichnet. (Es gibt keinen solchen Typ)
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 |
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.
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.
Ü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 ...
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.
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)
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.
Recommended Posts