2013-02-07 21 views
33

मैं कुछ समूहीकरण के बाद बनाए गए एक MultiIndex के साथ एक DataFrame है:प्रारंभ में लगा एक पांडा के लिए एक स्तर MultiIndex

import numpy as np 
import pandas as p 
from numpy.random import randn 

df = p.DataFrame({ 
    'A' : ['a1', 'a1', 'a2', 'a3'] 
    , 'B' : ['b1', 'b2', 'b3', 'b4'] 
    , 'Vals' : randn(4) 
}).groupby(['A', 'B']).sum() 

df 

Output>   Vals 
Output> A B   
Output> a1 b1 -1.632460 
Output> b2 0.596027 
Output> a2 b3 -0.619130 
Output> a3 b4 -0.002009 

कैसे इतना है कि मैं इसे की तरह कुछ में बदल जाते हैं मैं MultiIndex करने के लिए एक स्तर पहले जोड़ें कार्य करें:

Output>      Vals 
Output> FirstLevel A B   
Output> Foo  a1 b1 -1.632460 
Output>    b2 0.596027 
Output>   a2 b3 -0.619130 
Output>   a3 b4 -0.002009 

उत्तर

62

आप पहली बार एक सामान्य स्तंभ के रूप में यह जोड़ने और फिर वर्तमान सूचकांक से संलग्न है, तो कर सकते हैं:

df['Firstlevel'] = 'Foo' 
df.set_index('Firstlevel', append=True, inplace=True) 

और आदेश को बदल अगर साथ की जरूरत:

df.reorder_levels(['Firstlevel', 'A', 'B']) 

कौन सा में परिणाम:

     Vals 
Firstlevel A B   
Foo  a1 b1 0.871563 
       b2 0.494001 
      a2 b3 -0.167811 
      a3 b4 -1.353409 
+1

यदि आप इसे मल्टीइंडेक्स कॉलम इंडेक्स के साथ डेटाफ्रेम के साथ करते हैं, तो यह स्तर जोड़ता है, जो शायद ज्यादातर मामलों में कोई फर्क नहीं पड़ता है, लेकिन हो सकता है कि अगर आप किसी और चीज़ के लिए मेटाडेटा पर निर्भर हैं। – naught101

26

एक पंक्ति में ऐसा करने का एक अच्छा तरीका pandas.concat() का उपयोग कर:

import pandas as pd 

pd.concat([df], keys=['Foo'], names=['Firstlevel']) 

यह सामान्यीकृत किया जा सकता कई डेटा फ्रेम में, docs देखें।

+10

'axis = 1' जोड़कर कॉलम में एक स्तर जोड़ने के लिए यह विशेष रूप से अच्छा है, क्योंकि' df.columns' में इंडेक्स की तरह "set_index" विधि नहीं है, जो हमेशा मुझे खराब करती है। –

+0

यह समाधान होना चाहिए, धन्यवाद – jlandercy

+1

यह अच्छा है क्योंकि यह 'pd.Series' ऑब्जेक्ट्स के लिए भी काम करता है, जबकि वर्तमान में स्वीकृत उत्तर (2013 से) नहीं है। – John

संबंधित मुद्दे