397 Stimmen

Pandas: Einen Level aus einem mehrstufigen Spaltenindex entfernen?

Wenn ich einen mehrstufigen Spaltenindex habe:

>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> pd.DataFrame([[1,2], [3,4]], columns=cols)

    a
   ---+--
    b | c
--+---+--
0 | 1 | 2
1 | 3 | 4

Wie kann ich die Ebene "a" dieses Index entfernen, um folgendes zu erhalten:

    b | c
--+---+--
0 | 1 | 2
1 | 3 | 4

473voto

DSM Punkte 317386

Sie können MultiIndex.droplevel verwenden:

>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> df = pd.DataFrame([[1,2], [3,4]], columns=cols)
>>> df
   a   
   b  c
0  1  2
1  3  4

[2 Zeilen x 2 Spalten]
>>> df.columns = df.columns.droplevel()
>>> df
   b  c
0  1  2
1  3  4

[2 Zeilen x 2 Spalten]

129voto

jxc Punkte 12858

Ab Pandas 0.24.0 können wir jetzt DataFrame.droplevel() verwenden:

cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
df = pd.DataFrame([[1,2], [3,4]], columns=cols)

df.droplevel(0, axis=1) 

#   b  c
#0  1  2
#1  3  4

Dies ist sehr nützlich, wenn Sie Ihre DataFrame Methodenkette fortsetzen möchten.

110voto

Mint Punkte 1898

Ein weiterer Weg, den Index zu entfernen, besteht darin, eine Listenabstraktion zu verwenden:

df.columns = [col[1] for col in df.columns]

   b  c
0  1  2
1  3  4

Diese Strategie ist auch nützlich, wenn Sie die Namen aus beiden Ebenen kombinieren möchten, wie im folgenden Beispiel, bei dem die untere Ebene zwei 'y's enthält:

cols = pd.MultiIndex.from_tuples([("A", "x"), ("A", "y"), ("B", "y")])
df = pd.DataFrame([[1,2, 8 ], [3,4, 9]], columns=cols)

   A     B
   x  y  y
0  1  2  8
1  3  4  9

Das Entfernen der oberen Ebene würde zwei Spalten mit dem Index 'y' hinterlassen. Dies kann vermieden werden, indem man die Namen mit der Listenabstraktion zusammenfügt.

df.columns = ['_'.join(col) for col in df.columns]

    A_x A_y B_y
0   1   2   8
1   3   4   9

Das war ein Problem, das ich nach einem Groupby hatte und es hat eine Weile gedauert, um diese andere Frage zu finden, die es gelöst hat. Ich habe diese Lösung speziell auf diesen Fall angepasst.

54voto

spacetyper Punkte 1316

Eine andere Möglichkeit, dies zu tun, besteht darin, df auf der Grundlage eines Querschnitts von df neu zuzuweisen, unter Verwendung der Methode .xs.

>>> df

    a
    b   c
0   1   2
1   3   4

>>> df = df.xs('a', axis=1, drop_level=True)

    # 'a' : Schlüssel, nach dem der Querschnitt erfolgen soll
    # axis=1 : Querschnitt der Spalte erhalten
    # drop_level=True : gibt den Querschnitt ohne den mehrstufigen Index zurück

>>> df

    b   c
0   1   2
1   3   4

20voto

BENY Punkte 302708

Ein kleiner Trick mit sum mit level=1 (funktioniert, wenn level=1 alle eindeutig ist)

df.sum(level=1,axis=1)
Out[202]: 
   b  c
0  1  2
1  3  4

Üblichere Lösung get_level_values

df.columns=df.columns.get_level_values(1)
df
Out[206]: 
   b  c
0  1  2
1  3  4

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