Ich habe einen DataFrame mit einem MultiIndex, der nach einer Gruppierung erstellt wurde:
import numpy as np
import pandas as p
from numpy.random import randn
df = p.DataFrame({
'A' : ['a1', 'a1', 'a2', 'a3']
, 'B' : ['b1', 'b2', 'b3', 'b4']
, 'Vals' : randn(4)
}).groupby(['A', 'B']).sum()
df
Output> Vals
Output> A B
Output> a1 b1 -1.632460
Output> b2 0.596027
Output> a2 b3 -0.619130
Output> a3 b4 -0.002009
Wie stelle ich dem MultiIndex ein Level voran, damit ich daraus etwas mache wie:
Output> Vals
Output> FirstLevel A B
Output> Foo a1 b1 -1.632460
Output> b2 0.596027
Output> a2 b3 -0.619130
Output> a3 b4 -0.002009
axis=1
, da diedf.columns
Methode "set_index" nicht wie der Index vorhanden ist, was mich immer nervt.pd.Series
Objekte funktioniert , während die aktuell akzeptierte Antwort (ab 2013) dies nicht tut.FirstLevel
wie im['Foo', 'Bar']
ersten Argument haben, auch die entsprechende Länge benötigt wird, dh[df] * len(['Foo', 'Bar'])
!pd.concat({'Foo': df}, names=['Firstlevel'])
Sie können es zuerst als normale Spalte hinzufügen und dann an den aktuellen Index anhängen.
Und ändern Sie die Reihenfolge bei Bedarf mit:
Was in ... endet:
quelle
Ich denke, das ist eine allgemeinere Lösung:
Einige Vorteile gegenüber den anderen Antworten:
quelle
Ich habe eine kleine Funktion aus der Antwort von cxrodgers gemacht. IMHO ist die beste Lösung, da sie unabhängig von Datenrahmen oder Serien nur mit einem Index funktioniert.
Es gibt einen Fix, den ich hinzugefügt habe: Die
to_frame()
Methode erfindet neue Namen für Indexstufen, die keinen haben. Daher hat der neue Index Namen, die im alten Index nicht vorhanden sind. Ich habe Code hinzugefügt, um diese Namensänderung rückgängig zu machen.Unten ist der Code, ich habe ihn selbst für eine Weile benutzt und er scheint gut zu funktionieren. Wenn Sie Probleme oder Randfälle finden, wäre ich sehr verpflichtet, meine Antwort anzupassen.
Es wurde der folgende unittest Code übergeben:
quelle
Wie wäre es, es mit pandas.MultiIndex.from_tuples von Grund auf neu zu erstellen ?
Ähnlich wie bei der Lösung von cxrodger ist dies eine flexible Methode, bei der das zugrunde liegende Array für den Datenrahmen nicht geändert wird.
quelle