2017-09-23 8 views
2

Ich versuche, neu zu organisieren eine Pandas Datenrahmen neu zu organisieren, dieWie ein Pandas Datenrahmen

t p q r s 
1 a 1 14 26 38 
1 b 2 15 27 39 
1 c 4 16 28 40 
2 a 6 18 30 42 
2 b 7 19 31 43 
2 c 8 20 32 44 
3 a 10 22 34 46 
3 b 11 23 35 47 
3 c 12 24 36 48 

Um eine ähnliche sieht das wie folgt aussieht:

a    b    c   
    p q r s p q r s p q r s 
1 1 14 26 38 2 15 27 39 4 16 28 40 
2 6 18 30 42 7 19 31 43 8 20 32 44 
3 10 22 34 46 11 23 35 47 12 24 36 48 

Irgendwelche Ideen?

Danke!

Antwort

2

können Sie verwenden unstack:

df = df.set_index('t', append=True).unstack().swaplevel(0,1, axis=1).sort_index(axis=1) 
print (df) 
t a    b    c    
    p q r s p q r s p q r s 
1 1 14 26 38 2 15 27 39 4 16 28 40 
2 6 18 30 42 7 19 31 43 8 20 32 44 
3 10 22 34 46 11 23 35 47 12 24 36 48 

Oder unstack + stack:

df = df.set_index('t', append=True).stack().unstack([1,2]) 
print (df) 
t a    b    c    
    p q r s p q r s p q r s 
1 1 14 26 38 2 15 27 39 4 16 28 40 
2 6 18 30 42 7 19 31 43 8 20 32 44 
3 10 22 34 46 11 23 35 47 12 24 36 48 
+0

Ich habe nicht mit Parameter bis heute stapeln gesehen :) – Dark

+1

weil standardmäßig 'uns tack 'benutze die letzte Stufe des MultiIndex, so ist der Parameter oft nicht notwendig. – jezrael

+0

@Bharathshetty, das 'Entstapeln' ist großartig! – Wen

2

Verwenden Dreh mit Swap-Ebene d.h

df.pivot(columns='t').swaplevel(0,1, axis=1).sort_index(axis=1) 

Ausgang:

 
t a    b    c    
    p q r s p q r s p q r s 
1 1 14 26 38 2 15 27 39 4 16 28 40 
2 6 18 30 42 7 19 31 43 8 20 32 44 
3 10 22 34 46 11 23 35 47 12 24 36 48 
0

Durch die Verwendung von melt und MultiIndex

df1=df.reset_index().melt(['index','t']) 
df1['new']=list(zip(df1.t,df1.variable)) 
df1=df1.pivot('index','new','value') 
df1.columns=pd.MultiIndex.from_tuples(df1.columns) 
df1 
Out[259]: 
     a    b    c    
     p q r s p q r s p q r s 
index             
1  1 14 26 38 2 15 27 39 4 16 28 40 
2  6 18 30 42 7 19 31 43 8 20 32 44 
3  10 22 34 46 11 23 35 47 12 24 36 48 
0

Und der Gewinner ist ...

(Mein Ausgangs df [29196708 Reihen x 5 Spalten], PC ist ein I7)

df = df.set_index('t', append=True).unstack().swaplevel(0,1, axis=1).sort_index(axis=1) 

... 32,5 Sekunden

Kurz gefolgt von

df.pivot(columns='t').swaplevel(0,1, axis=1).sort_index(axis=1) 

33,6 Sekunden lang

df = df.set_index('t', append=True).stack().unstack([1,2]) 

.. nahmen eine satte 71,1 Sekunden

(Didnt versuchen, den man hat Schmelze unter Verwendung wegen nicht einer Spalte mit dem Namen Variable)

Dank all für Ihre Hilfe