2016-05-11 7 views
0

エピソード3:パンダピボットテーブルネストソート第3

part 2において右端のレベル内でソートしながら、我々は、インデックスの階層的性質を保持していました。 part 1では、一番左のインデックスレベルにカスタムソートを適用し、一番右のインデックス内の値をソートしました。

今、両方の方法を組み合わせたいと思います。私は「B」のカスタムオーダーを指定したい

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 

は、次のデータフレームと結果のピボットテーブルを考えます。 は、これは動作するようです:

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

UPDATE: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 
+0

これは私のサンプルデータに有効ですが、実際のデータでは 'C'のすべてのインスタンスを合計していないようです(つまり、 'B'の場合は 'C' 'z'と 'A'は 'a'です)。 pivot_table関数でこれを行う方法はありますか?私は試しましたが、それは 'A'にキーエラーを投げた。 –

+0

@ DanceParty2、確かに、 "UPDATE"を参照してください – MaxU

+0

作品!今私はちょうど方法を学ぶ必要があります。ありがとう! –

関連する問題