2017-11-30 6 views
1

私は検索しましたが、パンダのデータフレームをアンスタッキングして並べ替える方法の解決策を見つけることができませんでした。パンダのデータフレームの展開と並べ替え

私は、次のデータフレームがあるとします。

df = pd.DataFrame({'type': [1, 2, 2, 1, 2, 1, 2, 1, 2, 2], 
        'band': ['A', 'B', 'C', 'C', 'B', 'B', 'A', 'A', 'B', 'C'], 
        'val': [0.18, 0.19, 0.20, 0.21, 0.22, 0.23, 0.24, 0.25, 0.26, 0.27]}) 

私は'type''band'でグループの両方の次元を越え平均値を取得し、列など'band'を表示するためにunstack()を使用することができます:

df.groupby(['type', 'band']).mean().unstack(level=1) 

マイ質問は、降順(またはより一般的には、任意にソートされた)順に列を並べ替えるにはどうすればよいですか?

出力は次のようになります。

val 
band A B   C 
type    
1 0.215 0.230000 0.210 
2 0.240 0.223333 0.235 

私が欲しいものは以下の通りです:

実際に
val 
band C B   A 
type    
1 0.210 0.230000 0.215 
2 0.235 0.223333 0.240 

、私は3列よりも多くを持っています。

+0

私は個人的にちょうど降順ソートを行いたいが、私はちょうど好奇心のためにそれを一般化する方法を求めていた@ayhan。いくつかの関数に基づいてソートすることが想像できますが、私は特別な例を念頭に置いていません。 – pault

答えて

2

あなたが列にsort_indexをしたいようだ:

df.groupby(['type', 'band']).mean().unstack(level=1)\ 
    .sort_index(axis=1, ascending=False) 

結果:任意の順序については

 val    
band  C  B  A 
type      
1  0.210 0.230 0.215 
2  0.235 0.223 0.240 

:ご注文は "C、A、B" であると言います。一般に、これは直接指定する必要があります。

order = list('CAB') 
df[order] 
+0

multiindexカラムがある場合は、 'level = ... 'も渡す必要があります。 [docs](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_index.html)を確認してください。 –

2

df.groupby(['type', 'band']).mean().unstack(level=1)の出力は別のDataFrameです。あなたは、次の操作を行うことができます。

df = df.groupby(['type', 'band']).mean().unstack(level=1) 
df = df.reindex_axis(sorted(df.columns, reverse=True), axis=1) 
+1

このメソッドは、 'lambda'関数を' sorted'に渡すことができるので、任意のソートを許可すると思います。 – pault

+0

@pault確実に 'key'関数をソートすることができます – fodma1

関連する問題