4 Stimmen

Auswahl von Daten aus dem Pandas-Panel mit MultiIndex

Ich habe eine DataFrame mit MultiIndex, zum Beispiel:

In [1]: arrays = [['one','one','one','two','two','two'],[1,2,3,1,2,3]]
In [2]: df = DataFrame(randn(6,2),index=MultiIndex.from_tuples(zip(*arrays)),columns=['A','B'])
In [3]: df
Out [3]:
          A         B
one 1 -2.028736 -0.466668
    2 -1.877478  0.179211
    3  0.886038  0.679528
two 1  1.101735  0.169177
    2  0.756676 -1.043739
    3  1.189944  1.342415

Nun möchte ich die Mittelwerte der Elemente 2 und 3 (Indexebene 1) für jede Zeile (Indexebene 0) und jede Spalte berechnen. Ich brauche also einen DataFrame, der wie folgt aussehen würde

                                 A                            B
one 1 mean(df['A'].ix['one'][1:3])  mean(df['B'].ix['one'][1:3])
two 1 mean(df['A'].ix['two'][1:3])  mean(df['B'].ix['two'][1:3])

Wie kann ich das tun, ohne Schleifen über Zeilen (Indexebene 0) des ursprünglichen Datenrahmens zu verwenden? Was ist, wenn ich dasselbe für ein Panel tun möchte? Es muss eine einfache Lösung mit groupby geben, aber ich lerne es immer noch und kann mich nicht an eine Antwort erinnern.

2voto

Matti John Punkte 18799

Sie können die Funktion xs verwenden, um auf Ebenen zu selektieren.

Beginnend mit:

              A         B
one 1 -2.712137 -0.131805
    2 -0.390227 -1.333230
    3  0.047128  0.438284
two 1  0.055254 -1.434262
    2  2.392265 -1.474072
    3 -1.058256 -0.572943

Sie können dann einen neuen Datenrahmen mit erstellen:

DataFrame({'one':df.xs('one',level=0)[1:3].apply(np.mean), 'two':df.xs('two',level=0)[1:3].apply(np.mean)}).transpose()

was das Ergebnis liefert:

            A         B
one -0.171549 -0.447473
two  0.667005 -1.023508

Um dasselbe zu tun, ohne die Elemente in der Ebene anzugeben, können Sie groupby verwenden:

grouped = df.groupby(level=0)
d = {}

for g in grouped:
    d[g[0]] = g[1][1:3].apply(np.mean)

DataFrame(d).transpose()

Bei Panels bin ich mir nicht sicher - es ist nicht so gut dokumentiert, aber etwas Ähnliches sollte möglich sein

2voto

joris Punkte 122243

Ich weiß, dass dies eine alte Frage ist, aber für alle, die diese Seite suchen und finden, ist die einfachere Lösung meiner Meinung nach die level Schlüsselwort in mean :

In [4]: arrays = [['one','one','one','two','two','two'],[1,2,3,1,2,3]]

In [5]: df = pd.DataFrame(np.random.randn(6,2),index=pd.MultiIndex.from_tuples(z
ip(*arrays)),columns=['A','B'])

In [6]: df
Out[6]:
              A         B
one 1 -0.472890  2.297778
    2 -2.002773 -0.114489
    3 -1.337794 -1.464213
two 1  1.964838 -0.623666
    2  0.838388  0.229361
    3  1.735198  0.170260

In [7]: df.mean(level=0)
Out[7]:
            A         B
one -1.271152  0.239692
two  1.512808 -0.074682

In diesem Fall bedeutet dies, dass die Ebene 0 über der Achse 0 beibehalten wird (die Zeilen, Standardwert für mean )

0voto

ely Punkte 69114

Gehen Sie wie folgt vor:

# Specify the indices you want to work with.
idxs = [("one", elem) for elem in [2,3]] + [("two", elem) for elem in [2,3]]

# Compute grouped mean over only those indices.
df.ix[idxs].mean(level=0)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X