パンダでの多重指数ソート


88

pandas dfにマルチインデックス列を持つデータセットがあり、特定の列の値で並べ替えたいと思います。sortindexとsortlevelを使用しようとしましたが、探している結果を得ることができませんでした。私のデータセットは次のようになります:

    Group1    Group2
    A B C     A B C
1   1 0 3     2 5 7
2   5 6 9     1 0 0
3   7 0 2     0 3 5 

グループ1の列Cですべてのデータとインデックスを降順で並べ替えて、結果が次のようになるようにします。

    Group1    Group2
    A B C     A B C
 2  5 6 9     1 0 0
 1  1 0 3     2 5 7
 3  7 0 2     0 3 5 

データが含まれている構造でこの並べ替えを行うことは可能ですか、それともGroup1をインデックス側にスワップする必要がありますか?

回答:


131

MultiIndexでソートする場合、リスト内の列を説明するタプルを含める必要があります*:

In [11]: df.sort_values([('Group1', 'C')], ascending=False)
Out[11]: 
  Group1       Group2      
       A  B  C      A  B  C
2      5  6  9      1  0  0
1      1  0  3      2  5  7
3      7  0  2      0  3  5

*パンダを混乱させないように、最初にGroup1で、次にCで並べ替えたいと考えます。


注:元々.sortは廃止されてから使用されていましたが、0.20で削除されました.sort_values


ありがとう、まさに私が探していたもの。
MattB 2013

うーん。私よりも速く、起動するためのより良いソリューションです。
DSM

2
まさに私が必要としていたもの、ありがとう。それはドキュメントからは明らかではありませんでした(少なくとも私はそれを見つけられませんでした)。また、トップレベルのみを定義する場合のエラーメッセージは誤解を招く可能性がありますCannot sort by duplicate column X
Jan-Philip Gehrcke博士2013

リストを使用しなければならない理由の説明を追加していただき、ありがとうございます。Pandasがリストとタプルを検出し、タプルを列のリストではなく列の選択として解釈することを望みます...
Kaushik Ghose 2013

6
@KaushikGhoseは良い機能リクエストかもしれません、私はあなたがlocを使うことができると思います:df.loc[('Group1', 'C')]
Andy Hayden
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.