2012-11-05 18 views
30

So habe ich gelernt, dass ich DataFrame.groupby verwenden kann, ohne einen MultiIndex für Unterabtastung/Querschnitte zu haben.Vorteile von Pandas Multiindex?

Auf der anderen Seite, wenn ich einen MultiIndex auf einem DataFrame habe, muss ich noch DataFrame.groupby verwenden, um Subsampling/Querschnitte zu machen.

Also was ist ein MultiIndex gut für abgesehen von der recht hilfreiche und hübsche Darstellung der Hierarchien beim Drucken?

Antwort

58

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 
+6

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

+0

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']) –