2016-12-18 19 views
6

Ich mache Datenrahmen wie folgt.Set Multi Spalte Index in Pandas

df = pd.DataFrame({ 
    'class' : ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'], 
    'number' : [1,2,3,4,5,1,2,3,4,5], 
    'math' : [90, 20, 50, 30, 57, 67, 89, 79, 45, 23], 
    'english' : [40, 21, 68, 89, 90, 87, 89, 54, 21, 23] 
}) 

und ich möchte unter Verwendung einiger Pandas Methoden Index diese konvertieren. (Ex. Set_index, Stapel ,,,)

df1 = pd.DataFrame(np.random.randint(1, 100, (5, 4)), 
      columns = [['A', 'A', 'B', 'B'],['english', 'math', 'english', 'math']], 
      index = [1, 2, 3, 4, 5]) 

wie kann ich das tun?

Antwort

7

Ich glaube, Sie set_index mit unstack zum Umformen müssen, tauschen dann Ebenen in MultiIndex in Spalten von swaplevel und letzten Sortierspalten von sort_index:

df1 = df.set_index(['number','class']).unstack().swaplevel(0,1,1).sort_index(1) 

print (df1) 
class  A   B  
     english math english math 
number       
1   40 90  87 67 
2   21 20  89 89 
3   68 50  54 79 
4   89 30  21 45 
5   90 57  23 23 

Eine andere Lösung mit stack und unstack:

print (df.set_index(['number','class']).stack().unstack([1,2])) 
class  A   B  
     english math english math 
number       
1   40 90  87 67 
2   21 20  89 89 
3   68 50  54 79 
4   89 30  21 45 
5   90 57  23 23 
2

Ich mag @jezrael eine Antwort, aber nur der Vollständigkeit halber - Sie können auch pandas.DataFrame.pivot_table verwenden anstelle von set_index + unstack:

>>> df.pivot_table(index='number', columns='class').swaplevel(axis=1).sort_index(1) 
class  A   B  
     english math english math 
number       
1   40 90  87 67 
2   21 20  89 89 
3   68 50  54 79 
4   89 30  21 45 
5   90 57  23 23 
Verwandte Themen