2016-04-01 12 views
2

Ich möchte die Spalten meines Datenrahmens in Gruppen organisieren. Allgemein kann ich bei der Analyse Variablen wie Bezeichnervariablen, unabhängige Variablen und abhängige Variablen haben, und ich denke, es ist organisatorisch sinnvoll, alle diese Variablen unter gemeinsamen Überschriften zusammenzufassen.Organisieren von DataFrame-Spalten in MultiIndex

Hier ist ein Beispiel

import string 
import pandas as pd 

df = pd.DataFrame({"a": list(string.ascii_lowercase[:5]), 
       "b" : np.arange(0,5), 
       "c":list(string.ascii_uppercase[:5]), 
       "d" : np.arange(5,10)}) 
index1 = pd.MultiIndex.from_product([["Letter"], ["a","c"]]) 
index2 = pd.MultiIndex.from_product([["Number"], ["b", "d"]]) 
index = index1.union(index2) 
df.columns = index 

Dies gilt nicht genau arbeiten.

Letter Number 
    a c b d 
0 a 0 A 5 
1 b 1 B 6 
2 c 2 C 7 
3 d 3 D 8 
4 e 4 E 9 

Stattdessen muss ich

df = df[index.get_level_values(1)] 
    df.columns = index 

hinzufügen, um die Spalten neu zu ordnen, so dass sie mit der zweiten Ebene Multiindex in einer Reihe aufstellen, bevor ich den Index ändern. Das fühlt sich etwas klobig an und ich habe mich nur gefragt, ob es einen besseren Weg dafür gibt.

+0

'df = df [index.get_level_values ​​(1)] scheint abgehört? –

+0

Ich weiß nicht über Bugged ... vielleicht nur unnötig. Ich suche nur nach einer sauberen Syntax, um Spalten zusammenzufassen und einen Multiindex hinzuzufügen. Selbst '' 'pd.MultiIndex.from_product''' scheint klobig zu sein. Ich muss einen Multi-Index für jede Gruppe von Spalten erstellen. Ich möchte nur eine Partition der Spalten und Schlüssel für jede Partition angeben und einen hierarchischen Datenrahmen zurückgeben. – Ben

Antwort

0

ist hier eine gute Lösung:

import string 
import pandas as pd 

df = pd.DataFrame({"a": list(string.ascii_lowercase[:5]), 
       "b" : np.arange(0,5), 
       "c":list(string.ascii_uppercase[:5]), 
       "d" : np.arange(5,10)}) 
index1 = pd.MultiIndex.from_product([["Letter"], ["a","c"]]) 
index2 = pd.MultiIndex.from_product([["Number"], ["b", "d"]]) 
index = index1.union(index2) 
df.columns = index 

print(df) 
    Letter Number 
     a c  b d 
0  a 0  A 5 
1  b 1  B 6 
2  c 2  C 7 
3  d 3  D 8 
4  e 4  E 9 

Eine pythonic Weise Multiindex Spalten

df.columns = df.columns.map('_'.join) 
print(df) 

Ausgang der Abflachung:

Letter_a Letter_c Number_b Number_d 
0  a   0  A   5 
1  b   1  B   6 
2  c   2  C   7 
3  d   3  D   8 
4  e   4  E   9