2016-10-24 1 views
14

Sie wollen sagen, dass ich einen Datenrahmen, die wie folgt aussieht:Wie einfach eine Spalte Ebene zu einem Pandas Datenrahmen

df = pd.DataFrame(index=list('abcde'), data={'A': range(5), 'B': range(5)}) 
df 
Out[92]: 
    A B 
a 0 0 
b 1 1 
c 2 2 
d 3 3 
e 4 4 

Asumming, dass dieser Datenrahmen bereits vorhanden sein, wie kann ich einfach ein Level ‚C‘ in der der Spaltenindex dieses ich so:

df 
Out[92]: 
    A B 
    C C 
a 0 0 
b 1 1 
c 2 2 
d 3 3 
e 4 4 

ich sah sO anwser wie diese python/pandas: how to combine two dataframes into one with hierarchical column index? aber diese concat verschiedenen Datenrahmen stattdessen eine Spalte Ebene zu einer bereits bestehenden Datenrahmen hinzuzufügen.

-

Antwort

14

Wie @StevenG selbst vorgeschlagen, eine bessere Antwort:

df.columns = pd.MultiIndex.from_product([df.columns, ['C']]) 

print(df) 
# A B 
# C C 
# a 0 0 
# b 1 1 
# c 2 2 
# d 3 3 
# e 4 4 
+0

das ist großartig, Ich mag 'pd.MultiIndex.from_product ([df.columns, ['C']]) 'das ist ein Biss trivialer, da Sie die' len' von 'df.columns' nicht im Auge behalten müssen. Hast du etwas dagegen, es der Antwort hinzuzufügen, damit ich es akzeptieren kann? –

+0

@StevenG toll Ich kannte diesen Trick nicht. Danke, ich habe etwas Neues gelernt :-) – Romain

+3

Hast du irgendwelche Tipps, wie man ein anderes Level hinzufügt, wenn das Original df bereits Multiindex-Spaltennamen hat? Ich habe versucht, neue Ebene mit from_product() -Methode hinzuzufügen, jedoch erhielt ich diese Fehlermeldung: "NotImplementedError: isnull ist nicht für MultiIndex definiert". –

6

Option 1
set_index und T

df.T.set_index(np.repeat('C', df.shape[1]), append=True).T 

Option 2
pd.concat, keys und swaplevel

pd.concat([df], axis=1, keys=['C']).swaplevel(0, 1, 1) 

enter image description here

+0

Danke wusste nicht über Swap und das ist praktisch. Ich habe es für einen großen Datenrahmen getestet, um zu sehen, ob es effizienter war, als 'pd.MultiIndex.from_product ([df.columns, ['C']])' 'einzustellen und es war ungefähr 25% langsamer. –

+0

Keine Überraschungen! Romains Antwort ist schneller. Ich habe das hinzugefügt, weil ich denke, es ist wertvoll zu wissen. – piRSquared

+0

'pd.concat ([df], Achse = 1, Schlüssel = ['C'])' funktionierte sehr gut für Multilevel-Spalten –

Verwandte Themen