Wenn ich einen mehrstufigen Spaltenindex habe:
>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> pd.DataFrame([[1,2], [3,4]], columns=cols)
ein --- + - b | c - + --- + - 0 | 1 | 2 1 | 3 | 4
Wie kann ich die "a" -Ebene dieses Index löschen, sodass ich am Ende Folgendes habe:
b | c - + --- + - 0 | 1 | 2 1 | 3 | 4
droplevel
works kann über den Parameter entweder an mehrstufigen Indizes oder Spalten arbeitenaxis
.Antworten:
Sie können verwenden
MultiIndex.droplevel
:quelle
>>> df.columns = df.columns.droplevel(0)
>>> df.index = df.index.droplevel(1)
df.columns.droplevel()
ist nicht mehr verfügbar.>>>df.columns = df.columns.droplevel(2) >>>df.columns = df.columns.droplevel(0)
Eine andere Möglichkeit, den Index zu löschen, besteht darin, ein Listenverständnis zu verwenden:
Diese Strategie ist auch nützlich, wenn Sie die Namen beider Ebenen wie im folgenden Beispiel kombinieren möchten, in dem die unterste Ebene zwei Ys enthält:
Wenn Sie die oberste Ebene löschen, bleiben zwei Spalten mit dem Index 'y' übrig. Dies kann vermieden werden, indem die Namen mit dem Listenverständnis verbunden werden.
Das ist ein Problem, das ich hatte, nachdem ich einen Groupby gemacht hatte, und es dauerte eine Weile, bis ich diese andere Frage gefunden hatte , die es löste. Ich habe diese Lösung hier an den speziellen Fall angepasst.
quelle
[col[1] for col in df.columns]
ist direkterdf.columns.get_level_values(1)
.[col[0] if col[1] == '' else col[1] for col in df.columns]
Eine andere Möglichkeit, dies zu tun, besteht darin,
df
basierend auf einem Querschnitt vondf
mit der .xs- Methode eine Neuzuweisung vorzunehmen .quelle
b
), dann diese Ebene fallen lassen und mit der ersten Ebene (a
) belassen werden , würde das Folgende funktionieren:df = df.xs('b', axis=1, level=1, drop_level=True)
Ab Pandas 0.24.0 können wir jetzt DataFrame.droplevel () verwenden :
Dies ist sehr nützlich, wenn Sie Ihre DataFrame-Methodenkette am Laufen halten möchten.
quelle
Sie können dies auch erreichen, indem Sie die Spalten umbenennen:
df.columns = ['a', 'b']
Dies beinhaltet einen manuellen Schritt, kann jedoch eine Option sein, insbesondere wenn Sie Ihren Datenrahmen eventuell umbenennen würden.
quelle
df.columns.get_level_values(1)
.Ein kleiner Trick
sum
mit Level = 1 (Arbeit, wenn Level = 1 eindeutig ist)Häufigere Lösung
get_level_values
quelle
Ich habe mit diesem Problem zu kämpfen, da ich nicht weiß, warum meine droplevel () -Funktion nicht funktioniert. Arbeiten Sie mehrere durch und lernen Sie, dass 'a' in Ihrer Tabelle der Spaltenname und 'b', 'c' der Index ist. Tun Sie dies wird helfen
quelle