熊猫数据透视表排序指数等级1不“粘”

时间:2016-06-13 20:33:56

标签: pandas indexing pivot-table transpose

我知道这很多,但我真的无法确定造成问题的原因。 大部分代码只是为了演示我正在做的事情,但它的短端是:

  • 重新排序多索引数据框中的列(通过 转置和其他方法),调用columns.levels返回 原始的排序水平而不是新的水平。

鉴于以下内容:

#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']])

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

提前致谢!

1 个答案:

答案 0 :(得分:2)

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')]