2016-05-21 6 views
1

mit dem folgenden Datenrahmen:Pandas Kopfzeile für Multiindex

d2=pd.DataFrame({'Item':['y','y','z','x'], 
       'other':['aa','bb','cc','dd']}) 
d2 

    Item other 
0 y  aa 
1 y  bb 
2 z  cc 
3 x  dd 

Ich mag würde eine Zeile nach oben addieren und dann verwenden, die als Ebene 1 eines multiIndexed-Header. Ich kann nicht immer vorhersagen, wie viele Spalten der Datenrahmen haben wird, also sollte die neue Zeile dies zulassen (d. H. Zufällige Zeichen oder Zahlen sind in Ordnung). Ich bin auf der Suche nach so etwas wie folgt aus:

Item other 
    A  B 
0 y  aa 
1 y  bb 
2 z  cc 
3 x  dd 

Aber auch hier wird die Anzahl der Spalten variieren und nicht vorhergesagt werden kann.

Vielen Dank im Voraus!

Antwort

1

Ich denke, Sie können die Anzahl der Spalten zuerst durch shape finden und dann Liste von range erstellen. Zuletzt erstellen MultiIndex.from_tuples.

print (d2.shape[1]) 
2 

print (range(d2.shape[1])) 
range(0, 2) 

cols = list(zip(d2.columns, range(d2.shape[1]))) 
print (cols) 
[('Item', 0), ('other', 1)] 

d2.columns = pd.MultiIndex.from_tuples(cols) 
print (d2) 

    Item other 
    0  1 
0 y aa 
1 y bb 
2 z cc 
3 x dd 

Wenn Sie Alphabet Spalten und Anzahl der Spalten müssen, ist weniger als 26 verwenden:

import string 
print (list(string.ascii_uppercase)) 
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] 

print (d2.shape[1]) 
2 

print (list(string.ascii_uppercase)[:d2.shape[1]]) 
['A', 'B'] 

cols = list(zip(d2.columns, list(string.ascii_uppercase)[:d2.shape[1]])) 
print (cols) 
[('Item', 'A'), ('other', 'B')] 

d2.columns = pd.MultiIndex.from_tuples(cols) 
print (d2) 
    Item other 
    A  B 
0 y aa 
1 y bb 
2 z cc 
3 x dd