2017-04-04 32 views
5

Tôi bắt đầu với DataFrame sau:Pandas: cách tối ưu để cột MultiIndex

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

enter image description here

Tôi muốn làm cho nó trông như thế này:

enter image description here

Và tôi có thể làm điều đó, với mã này:

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 

Nhưng có rất nhiều bước ở đây mà tôi cảm thấy mùi mã, hoặc ít nhất là một cái gì đó mơ hồ không phải là gấu trúc thành ngữ, như thể tôi đang thiếu điểm của một cái gì đó trong API. Làm tương đương với chỉ mục dựa trên hàng chỉ là một bước, ví dụ: qua set_index(). (Lưu ý rằng tôi biết rằng các cột tương đương với set_index()is still an open issue). Có cách nào tốt hơn, chính thức hơn để thực hiện việc này không?

Trả lời

11

Bạn có thể sử dụng stack(), to_frame(), và T cho chuyển vị.

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


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

Tôi có thể cung cấp cho bạn một số lời khuyên không? Upvote câu hỏi đặc biệt là nếu OP nhận được sau khi upvote 15+ điểm của bạn - sau đó OP có thể upvote giải pháp của bạn;) – jezrael

2

Hãy nghĩ về nó như một khung dữ liệu được chuyển đổi. Ở đây bạn đi:

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 
Các vấn đề liên quan