2016-04-20 13 views
1

ich derzeit eine Pandas Datenrahmen in dieser Konfiguration habenReindizieren einen Datenrahmen vorhandenen Spalten als Multi-Index mit

col_1 col_2 col_3 col_4 
0 fish  50g  3  £5 
1 cheese 50g  4  £6 
2 fish  100g 2  £20 
3 fish  200g 2  £25 
4 bread 50g  15  £50 
. ...  ...  ...  ... 

Ich möchte einen Datenrahmen in dieser Konfiguration

   col_3 col_4 
fish 50g  3  £5 
     100g  2 £20 
     200g  2 £25 
cheese 50g  4  £6 
bread 50g  15 £50 
    ... ... ... ... 

Ich habe haben schaute auf die Dokumente bei the pandas website und ich bin zu der Schlussfolgerung gekommen, dass ich die pd.MultiIndex Konstruktoren verwenden muss.

Doch egal welche Variation von pd.MultiIndex.constructor(df[["col_1","col_2"]]) Ich versuche, ich habe nicht aus ein m_index Objekt, das funktioniert, wenn ich versuche, es zu benutzen, wie pd.DataFrame(df,index=m_index)

Was mache ich falsch?

+1

Sie suchen 'df.set_index ([ 'col_1', 'col_2'])'? – Zero

Antwort

1

Ich glaube, Sie set_index und dann sort_index, aber für die korrekte Sortierung ist notwendig nehmen letztes Zeichen g aus Spalte col_2 und warf von astype zu int (oder float) verwenden können. Zuletzt können Sie g hinzufügen und neue MultiIndexfrom_tuples:

df['col_2'] = df['col_2'].str[:-1].astype(int) 

print df.set_index(['col_1','col_2']) 
       col_3 col_4 
col_1 col_2    
fish 50   3  5 
cheese 50   4  6 
fish 100  2  20 
     200  2  25 
bread 50  15  50 

print df.set_index(['col_1','col_2']) 
     .sort_index(level=['col_1','col_2'], ascending=[False,True]) 

       col_3 col_4 
col_1 col_2    
fish 50   3  5 
     100  2  20 
     200  2  25 
cheese 50   4  6 
bread 50  15  50 
df1 = df.set_index(['col_1','col_2']) 
     .sort_index(level=['col_1','col_2'], ascending=[False,True]) 

       col_3 col_4 
col_1 col_2    
fish 50   3  5 
cheese 50   4  6 
fish 100  2  20 
     200  2  25 
bread 50  15  50 

#change multiindex 
new_index = zip(df1.index.get_level_values('col_1'), 
       df1.index.get_level_values('col_2').astype(str) + 'g') 
df1.index = pd.MultiIndex.from_tuples(new_index, names = df1.index.names) 
print df1 
       col_3 col_4 
col_1 col_2    
fish 50g  3  5 
     100g  2  20 
     200g  2  25 
cheese 50g  4  6 
bread 50g  15  50