Pandas pivot table嵌套排序第3部分

时间:2016-05-11 16:51:33

标签: sorting python-3.x pandas pivot-table

第3集:

part 2中,我们保留了索引的分层性质,同时在最右边的级别进行排序。在part 1中,我们将自定义排序应用于最左侧索引级别,同时对最右侧索引中的值进行排序。

现在,我想结合两种方法。

给出以下数据框和结果数据透视表:

import pandas as pd
df=pd.DataFrame({'A':['a','a','a','a','a','b','b','b','b'],
                 'B':['x','y','z','x','y','z','x','y','z'],
                 'C':['a','b','a','b','a','b','a','b','a'],
                 'D':[7,5,3,4,1,6,5,3,1]})
df

    A   B   C   D
0   a   x   a   7
1   a   y   b   5
2   a   z   a   3
3   a   x   b   4
4   a   y   a   1
5   b   z   b   6
6   b   x   a   5
7   b   y   b   3
8   b   z   a   1

table = pd.pivot_table(df, index=['A', 'B','C'],aggfunc='sum')
table
            D
A   B   C   
a   x   a   7
        b   4
    y   a   1
        b   5
    z   a   3
b   x   a   5
    y   b   3
    z   a   1
        b   6

我想指定' B'的自定义订单。 这似乎有效:

df['B']=df['B'].astype('category')
df['B'].cat.set_categories(['z','x','y'],inplace=True)

接下来,我希望数据透视表能够保持' B'在排序值时对上面指定的内容进行排序' D'在每个类别的B'。

像这样:

            D
A   B   C   
    z   a   3
    x   a   7
a       b   4
    y   b   5
        a   1
    z   b   6
b       a   1
    x   a   5
    y   b   3

提前致谢!

1 个答案:

答案 0 :(得分:1)

更新:使用pivot_table()

In [79]: df.pivot_table(index=['A','B','C'], aggfunc='sum').reset_index().sort_values(['A','B','D'], ascending=[1,1,0]).set_index(['A','B','C'])
Out[79]:
       D
A B C
a x a  7
    b  4
  y b  5
    a  1
  z a  3
b x a  5
  y b  3
  z b  6
    a  1

是你想要的吗?

In [64]: df.sort_values(['A','B','D'], ascending=[1,1,0]).set_index(['A','B','C'])
Out[64]:
       D
A B C
a z a  3
  x a  7
    b  4
  y b  5
    a  1
b z b  6
    a  1
  x a  5
  y b  3