2015-10-17 11 views
7

パンダでは0.17私は階層インデックス(AとB)を維持しながら特定の列でソートしようとします。 Bは、連結によってデータフレームを設定するときに作成された実行番号です。私のデータは次のようになります。以下は Python Pandasマルチインデクスとカラムによるソート

  C  D 
A B 
bar two dull 5 
    three glossy 8 
    one shiny 10 
foo one dull 3 
    three matt 12 
    two shiny 9 

は、私が使用していたコードと結果である:

  C  D 
A B 
bar one shiny 10 
    two dull 5 
    three glossy 8 
foo one dull 3 
    two shiny 9 
    three matt 12 

これは私が必要なものです。注:Pandas 0.17は、dataframe.sortが推奨されなくなることを警告します。

df.sort_index(axis=0, level=0, as_index=True).groupby(C, as_index=True) 

私はない特定の:列がない実りあるGROUPBY最初のインデックスをソートに切り替え、同様

df.sort_values(by="C", ascending=True).groupby(axis=0, level=0, as_index=True) 

、および:

df.sort_values(by="C", ascending=True) 
      C  D 
A B 
bar two dull 5 
foo one dull 3 
bar three glossy 8 
foo three matt 12 
bar one shiny 10 
foo two shiny 9 

追加.groupbyは同じ結果を生成します再インデクシングについて私は最初のインデックスAを保持する必要があり、2番目のインデックスBは再割り当てすることができますが、する必要はありません。簡単な解決法がないと私は驚いてしまうだろう。私はそれを見つけられないと思う。どんな提案も感謝しています。


編集:私は第2のインデックスBを落とした一方で、索引が複数の列を並べ替えの代わりに列になるように最初のインデックスAを再割り当て、それを再インデックス付け:静止

df.index = df.index.droplevel(1) 
df.reset_index(level=0, inplace=True) 
df_sorted = df.sort_values(["A", "C"], ascending=[1,1]) #A is a column here, not an index. 
df_reindexed = df_sorted.set_index("A") 

非常に詳細。

答えて

6

は、より良い方法があるかもしれないように感じますが、ここでは一つのアプローチです:

chrisbのコードに基づいて
In [163]: def sorter(sub_df): 
    ...:  sub_df = sub_df.sort_values('C') 
    ...:  sub_df.index = sub_df.index.droplevel(0) 
    ...:  return sub_df 

In [164]: df.groupby(level='A').apply(sorter) 
Out[164]: 
       C D 
A B     
bar two  dull 5 
    three glossy 8 
    one  shiny 10 
foo one  dull 3 
    three matt 12 
    two  shiny 9 
+0

あなたのアプローチは私の中間的な解決策よりも進んでいますが、より良い方法があるはずです。 – raummensch

1

:私の場合、それはシリーズでないデータフレームだということ

注意、

s.groupby(level='A', group_keys=False).apply(lambda x: x.sort_values(ascending=False))