2017-04-04 5 views
5

Ich beginne mit den folgenden DataFrame:Pandas: Optimaler Weg zu Multiindex Spalten

df_1 = DataFrame({ 
     "Cat1" : ["a", "b"], 
     "Vals1" : [1,2] , 
     "Vals2" : [3,4] 
    }) 
df 

enter image description here

ich mag es bekommen wie folgt aussehen:

enter image description here

Und mich kann es tun, mit diesem Code:

df_2 = (
    pd.melt(df_1, id_vars=["Cat1"]) 
    .T 
) 
df_2.columns = (
    pd.MultiIndex 
     .from_tuples(
      list(zip(df_2.loc["Cat1", :] , df_2.loc["variable", :])) , 
      names=["Cat1", None] 
     ) 
) 
df_2 = (
    df_2 
    .loc[["value"], :] 
    .reset_index(drop=True) 
    .sortlevel(0, axis=1) 
) 
df_2 

Aber es gibt so viele Schritte hier, dass ich Code-Geruch fühle, oder zumindest etwas vage pandas-idiomatisch, als ob ich den Punkt etwas in der API vermisse. Das Äquivalent für zeilenbasierte Indizes ist nur ein Schritt, z. B. über set_index(). (Beachten Sie, dass mir bekannt ist, dass die Spalten äquivalent zu set_index()is still an open issue sind). Gibt es einen besseren, offiziellen Weg, dies zu tun?

Antwort

11

Sie stack() verwenden können, to_frame() und T für transponieren.

df_1.set_index('Cat1').stack().to_frame().T 


Cat1  a   b  
    Vals1 Vals2 Vals1 Vals2 
0  1  3  2  4 
+1

Kann ich Ihnen einen Rat geben? Upvote Frage vor allem, wenn OP nach Ihrer Upvote 15+ Punkte bekommen - dann kann OP Ihre Lösungen verbessern;) – jezrael

2

Denken Sie darüber nach, wie ein transponierter Datenrahmen. Hier gehen Sie:

df.set_index('Cat1').unstack().swaplevel().sort_index().to_frame().T 
Out[46]: 
Cat1  a   b  
    Vals1 Vals2 Vals1 Vals2 
0  1  3  2  4 
Verwandte Themen