2017-11-19 9 views
2

pandasを使用する0.20.3データフレームのn個のマルチレベルを列( 'D')で値を(降順に)ソートしようとしています。維持されています。Python Pandasはマルチインデックスを列でソートしてもツリー構造を保持します

例入力:

    D 
A  B  C 
Gran1 Par1 Child1 3 
      Child2 7 
      Child3 2 
     Par2 Child1 9 
      Child2 2 
     Par3 Child1 6 
Gran2 Par1 Child1 3 
     Par2 Child1 8 
      Child2 2 
      Child3 3 
     Par3 Child1 6 
      Child2 8 

所望の結果:マルチレベルのインデックスをソートし、注文に関連する他の問題を

    D 
A  B  C 
Gran2 Par3 Child2 8 
      Child1 6 
     Par2 Child1 8 
      Child3 3 
      Child2 2 
     Par1 Child1 3 
Gran1 Par1 Child2 7 
      Child1 3 
      Child3 2 
     Par2 Child1 9 
      Child2 2 
     Par3 Child1 6 

ソリューション、指標の実際のレベルをソートまたは維持することに焦点を合わせているように見えます列をソートしながら順番に並べ替えます。列の値を使用してインデックスをその特定のレベルの集計値でソートするマルチレベルソートは見つかりませんでした。どんな提案も大歓迎です。

答えて

0

あなたはすべてのそれらの組み合わせによって3つの別々の配列と並べ替えを作成する必要があります。この例では、Numpyのnp.lexsortを使用して並べ替えを行い、次にその並べ替えを尊重するためにilocを使用します。最後に逆の並べ替えを取得するためにa[::-1]を使用します。

a = np.lexsort([ 
    df.D.values, 
    df.groupby(level=[0, 1]).D.transform('sum').values, 
    df.groupby(level=0).D.transform('sum').values 
]) 

df.iloc[a[::-1]] 

        D 
A  B C   
Gran2 Par3 Child2 8 
      Child1 6 
     Par2 Child1 8 
      Child3 3 
      Child2 2 
     Par1 Child1 3 
Gran1 Par1 Child2 7 
      Child1 3 
      Child3 2 
     Par2 Child1 9 
      Child2 2 
     Par3 Child1 6 
0

sum値、その後sort_valuesと最後set_indexためtransformその後、MultiIndexからの列のreset_indexが必要:

df = df.reset_index() 
df['G'] = df.groupby(['A','B'])['D'].transform('sum') 

df = df.sort_values(['A','G','D'], ascending=False).drop('G',1).set_index(['A','B','C']) 
print (df) 

        D 
A  B C   
Gran2 Par3 Child2 8 
      Child1 6 
     Par2 Child1 8 
      Child3 3 
      Child2 2 
     Par1 Child1 3 
Gran1 Par1 Child2 7 
      Child1 3 
      Child3 2 
     Par2 Child1 9 
      Child2 2 
     Par3 Child1 6 
+0

ありがとうございます!クイックだけど、まだ私が求めている解決策ではない。 Gran1内では、パー1内の合計はPar3内の合計よりも大きいので、より高くする必要があります。だからソートはレベルAからCの順番で行うべきです。うまくいけば説明が意味をなさない... –

+0

私の実際のデータセットではうまくいくようです...あなたの解決策の出力は正しいですか?それはあなたの解決策と一致していないようです。私はこれ以上のレベルでこれを拡張できるかどうかを試してみます。ありがとう! –

+0

実際にはまだ動作していません...データセットの2番目の列はソートされているようですが、他のものはソートされていないようです...希望の結果で別の出力を確認してください –

関連する問題