it-swarm.com.de

Pandas: ein Level von einem mehrstufigen Spaltenindex löschen?

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 das "a" -Niveau dieses Index herabsetzen, so lande ich bei:

 b | c 
-- + --- + --
 0 | 1 | 2 
 1 | 3 | 4 
149
David Wolever

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 rows x 2 columns]
>>> df.columns = df.columns.droplevel()
>>> df
   b  c
0  1  2
1  3  4

[2 rows x 2 columns]
206
DSM

Eine andere Möglichkeit, den Index zu löschen, ist die Verwendung eines Listenverständnisses: 

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 beider Ebenen wie im folgenden Beispiel kombinieren möchten, wenn die untere Ebene zwei 'y' 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

Wenn Sie die oberste Ebene löschen, bleiben zwei Spalten mit dem Index 'y'. Dies kann vermieden werden, indem die Namen mit dem Listenverständnis verbunden werden.

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 hatte, nachdem ich eine Gruppe zusammengestellt hatte, und es dauerte eine Weile, bis diese andere Frage das Problem gelöst hatte. Ich habe diese Lösung hier an den konkreten Fall angepasst.

38
Mint

Eine andere Möglichkeit besteht darin, df basierend auf einem Querschnitt von df mithilfe der Methode .xs neu zuzuweisen.

>>> df

    a
    b   c
0   1   2
1   3   4

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

    # 'a' : key on which to get cross section
    # axis=1 : get cross section of column
    # drop_level=True : returns cross section without the multilevel index

>>> df

    b   c
0   1   2
1   3   4
32
spacetyper

Das können Sie auch erreichen, indem Sie die Spalten umbenennen:

df.columns = ['a', 'b']

Dies ist ein manueller Schritt, kann jedoch eine Option sein, insbesondere wenn Sie Ihren Datenrahmen eventuell umbenennen möchten.

13
sedeh

Ein kleiner Trick mit sum mit level = 1 (Arbeit, wenn level = 1 alles eindeutig ist)

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

Mehr gängige Lösung get_level_values

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

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 am Laufen halten möchten.

3
jxc

Ich habe mit diesem Problem zu kämpfen, da ich nicht weiß, warum meine droplevel () - Funktion nicht funktioniert. Durchlaufen Sie mehrere und erfahren Sie, dass "a" in Ihrer Tabelle den Spaltennamen und "b", "c" den Index darstellt. Tun Sie dies, wird es helfen

df.columns.name = None
df.reset_index() #make index become label
0
dhFrank