2017-04-04 15 views
5

मैं निम्नलिखित DataFrame के साथ शुरू:पांडा: MultiIndex कॉलम के लिए इष्टतम तरीका

enter image description here

और मैं:

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

enter image description here

मैं इस तरह देखने के लिए इसे पाने के लिए चाहते हैं यह कर सकते हैं, इस कोड के साथ:

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 

लेकिन यहां इतने सारे कदम हैं कि मुझे कोड गंध महसूस होता है, या कम से कम कुछ अस्पष्ट रूप से पांडा-मूर्खतापूर्ण नहीं है, जैसे कि मैं एपीआई में कुछ बिंदु खो रहा हूं। पंक्ति-आधारित इंडेक्स के बराबर करना केवल एक कदम है, उदाहरण के लिए, set_index() के माध्यम से। (ध्यान दें कि मुझे पता है कि set_index()is still an open issue के बराबर कॉलम)। क्या ऐसा करने के लिए एक बेहतर, अधिक आधिकारिक तरीका है?

उत्तर

11

आप stack(), to_frame(), और T पक्षांतरित के लिए उपयोग कर सकते हैं।

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


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

क्या मैं आपको कुछ सलाह दे सकता हूं? उपरोक्त सवाल विशेष रूप से अगर ओपी आपके उपरांत 15+ अंक के बाद मिलता है - तो ओपी आपके समाधान को ऊपर उठा सकता है;) – jezrael

2

इसके बारे में एक ट्रांसपोज़ड डेटाफ्रेम के रूप में सोचें। ये रहा:

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 
संबंधित मुद्दे