Pandas 枢轴 Table 排序索引级别 1 不是 "Sticking"

Pandas Pivot Table Sort Index Level 1 Not "Sticking"

我知道这很多,但我真的无法确定导致问题的原因。 这段代码的大部分只是为了演示我在做什么,但它的简短结尾是:

鉴于以下情况:

#Original data frame
import pandas as pd
df = pd.DataFrame(
        {'Year':[2012,2012,2012,2012,2012,2012,2013,2013,2013,2013,2013,2013,2014,2014,2014,2014,2014,2014],
         'Type':['A','A','B','B','C','C','A','A','B','B','C','C','A','A','B','B','C','C'],
         'Org':['a','c','a','b','a','c','a','b','a','c','a','c','a','b','a','c','a','b'],
         'Enr':[3,5,3,6,6,4,7,89,5,3,7,34,4,64,3,6,7,44]
        })
df.head()
        Enr Org  Type   Year
0       3   a     A     2012
1       5   c     A     2012
2       3   a     B     2012
3       6   b     B     2012
4       6   a     C     2012

#Pivoted
dfp=df.pivot_table(df,index=['Year'],columns=['Type','Org'],aggfunc=np.sum)\
.sortlevel(ascending=True).sort_index(axis=1)
dfp
        Enr
Type    A                       B                       C
Org     a       b       c       a       b       c       a       b       c
Year                                    
2012    3.0     NaN     5.0     3.0     6.0     NaN     6.0     NaN     4.0
2013    7.0     89.0    NaN     5.0     NaN     3.0     7.0     NaN     34.0
2014    4.0     64.0    NaN     3.0     NaN     6.0     7.0     44.0    NaN

#Transposed
f=dfp.T
           Year     2012    2013    2014
        Type    Org             
 Enr     A      a   3.0     7.0     4.0
                b   NaN     89.0    64.0
                c   5.0     NaN     NaN
         B      a   3.0     5.0     3.0
                b   6.0     NaN     NaN
                c   NaN     3.0     6.0
         C      a   6.0     7.0     7.0
                b   NaN     NaN     44.0
                c   4.0     34.0    NaN


#Sort level 2 by last column and transpose back
ab2=f.groupby(level=1)[f.columns[-1]].transform(sum)
ab3=pd.concat([f,ab2],axis=1)
ab4=ab3.sort_values([ab3.columns[-1]],ascending=[0])
ab4=ab4.drop(ab4.columns[-1],axis=1,inplace=False)
g=ab4.T
g
    Enr
Type    A                       C                       B
Org     a       b       c       a       b       c       a       b       c
Year                                    
2012    3.0     NaN     5.0     6.0     NaN     4.0     3.0     6.0     NaN
2013    7.0     89.0    NaN     7.0     NaN     34.0    5.0     NaN     3.0
2014    4.0     64.0    NaN     7.0     44.0    NaN     3.0     NaN     6.0

我知道这很多,但我真的无法确定导致问题的原因。 如果你这样做:

g.Enr.columns.levels

结果是:

FrozenList([['A', 'B', 'C'], ['a', 'b', 'c']])

我的问题是:为什么不是: FrozenList([['A', 'C', 'B'], ['a', 'b', 'c']]) ?

我真的很需要它成为第二个

提前致谢!

A MultiIndex 将自身存储为一组 levels,它们是不同的可能值,labels,它们是实际使用的标签的整数代码。更改列顺序只是代码的重新洗牌,并没有改变实际的 levels.

如果您希望 levels 按它们首次出现的顺序排列,您可以这样做。

In [61]: c = g.Enr.columns

In [62]: [c.levels[i].take(pd.unique(c.labels[i]))
    ...:   for i in range(len(c.levels))]
Out[62]: 
[Index([u'A', u'C', u'B'], dtype='object', name=u'Type'),
 Index([u'a', u'b', u'c'], dtype='object', name=u'Org')]