2013-01-07 12 views
18

Gibt es eine kürzere Möglichkeit, eine Spalte MultiIndex-Ebene (in meinem Fall basic_amt) fallen lassen, außer es zweimal zu transponieren?Eine Spalte zurücksetzen MultiIndex Ebenen

In [704]: test 
Out[704]: 
      basic_amt    
Faculty   NSW QLD VIC All 
All    1 1 2 4 
Full Time   0 1 0 1 
Part Time   1 0 2 3 

In [705]: test.reset_index(level=0, drop=True) 
Out[705]: 
     basic_amt    
Faculty  NSW QLD VIC All 
0    1 1 2 4 
1    0 1 0 1 
2    1 0 2 3 

In [711]: test.transpose().reset_index(level=0, drop=True).transpose() 
Out[711]: 
Faculty NSW QLD VIC All 
All   1 1 2 4 
Full Time 0 1 0 1 
Part Time 1 0 2 3 

Antwort

10

Eine andere Lösung Verwendung Verwendung MultiIndex.droplevel mit rename_axis (neu in pandas0.18.0) ist:

import pandas as pd 

cols = pd.MultiIndex.from_arrays([['basic_amt']*4, 
            ['NSW','QLD','VIC','All']], 
            names = [None, 'Faculty']) 
idx = pd.Index(['All', 'Full Time', 'Part Time']) 

df = pd.DataFrame([(1,1,2,4), 
        (0,1,0,1), 
        (1,0,2,3)], index = idx, columns=cols) 

print (df) 
      basic_amt    
Faculty   NSW QLD VIC All 
All    1 1 2 4 
Full Time   0 1 0 1 
Part Time   1 0 2 3 

df.columns = df.columns.droplevel(0) 
#pandas 0.18.0 and higher 
df = df.rename_axis(None, axis=1) 
#pandas bellow 0.18.0 
#df.columns.name = None 

print (df) 
      NSW QLD VIC All 
All   1 1 2 4 
Full Time 0 1 0 1 
Part Time 1 0 2 3 

print (df.columns) 
Index(['NSW', 'QLD', 'VIC', 'All'], dtype='object') 

Wenn die Notwendigkeit, beide Spaltennamen list Verständnis verwenden:

df.columns = ['_'.join(col) for col in df.columns] 
print (df) 
      basic_amt_NSW basic_amt_QLD basic_amt_VIC basic_amt_All 
All     1    1    2    4 
Full Time    0    1    0    1 
Part Time    1    0    2    3 

print (df.columns) 
Index(['basic_amt_NSW', 'basic_amt_QLD', 'basic_amt_VIC', 'basic_amt_All'], dtype='object') 
+1

Beachten Sie auch: Wenn Sie einen Multiindex mit '_' als Trennzeichen abgeflacht haben und neu erstellen möchten, können Sie 'my_tuples = [i.split (" _ ") für i in df.columns]' verwenden und dann 'pd.MultiIndex.from_tuples (my_tuples)' – RobinL

11

Wie wäre es einfach df.columns Neuzuweisung:

levels = df.columns.levels 
labels = df.columns.labels 
df.columns = levels[1][labels[1]] 

Zum Beispiel:

import pandas as pd 

columns = pd.MultiIndex.from_arrays([['basic_amt']*4, 
            ['NSW','QLD','VIC','All']]) 
index = pd.Index(['All', 'Full Time', 'Part Time'], name = 'Faculty') 
df = pd.DataFrame([(1,1,2,4), 
        (0,01,0,1), 
        (1,0,2,3)]) 
df.columns = columns 
df.index = index 

Bevor:

print(df) 

      basic_amt    
       NSW QLD VIC All 
Faculty        
All    1 1 2 4 
Full Time   0 1 0 1 
Part Time   1 0 2 3 

Nach:

levels = df.columns.levels 
labels = df.columns.labels 
df.columns = levels[1][labels[1]] 
print(df) 

      NSW QLD VIC All 
Faculty      
All   1 1 2 4 
Full Time 0 1 0 1 
Part Time 1 0 2 3 
+1

Das wird nicht funktionieren, wenn man mehr als eine Kategorie in Multiindex level = 0, und dies (nach Ihrem Beispiel) hat vermasselt auch die Reihenfolge der Spalten. Können Sie sich eine allgemeinere (und ausfallsichere) Lösung vorstellen? – dmvianna

+0

Ich habe es gerade versucht und es scheint für mich zu funktionieren. Können Sie ein Beispiel für die Art von DataFrame geben, mit der Sie arbeiten? – unutbu

+0

df = pd.Datenrahmen (np.array (np.mat ('0 1 0 1; 1 0 2 3; 1 1 2 4'))) – dmvianna

1

Zip Ebene zusammen

Hier ist eine alternative Lösung, die die Ebene miteinander Reißverschluss und verbindet sie mit Unterstrich.

Abgeleitet von der obigen Antwort, und das war, was ich tun wollte, als ich diese Antwort fand. Dachte, ich würde teilen, auch wenn es nicht genau die obige Frage beantwortet.

["_".join(pair) for pair in df.columns] 

gibt

['basic_amt_NSW', 'basic_amt_QLD', 'basic_amt_VIC', 'basic_amt_All'] 

Nur soviel eingestellt als die Säulen

df.columns = ["_".join(pair) for pair in df.columns] 

      basic_amt_NSW basic_amt_QLD basic_amt_VIC basic_amt_All 
Faculty                
All     1    1    2    4 
Full Time    0    1    0    1 
Part Time    1    0    2    3 
Verwandte Themen