2017-05-18 16 views
1

私は私がやりたい何、このようになりますパンダのデータフレーム(df3マルチインデックスのランク列を並べ替えて追加するにはどうすればよいですか?

df1 = pd.DataFrame({ 
    "period": [1, 2, 3, 4] * 4, 
    "cat1": ["A"] * 8 + ["B"] * 8, 
    "cat2": (["X"] * 4 + ["Y"] * 4) * 2, 
    "amount": [100, 200, 300, 400, 110, 210, 310, 410, 120, 220, 320, 420, 130, 230, 330, 430], 
    "total": [1000] * 16 
}) 
df2 = df1.copy() 
df2.amount = df2.amount + 1 
df3 = pd.concat([df1, df2]) 

を持っているがcat1cat2、およびperiodの値に基づいてグループに

  • 分割されています。
  • これらの各グループ内の値が最大amountのローにフィルタリングします。
  • ['cat1', 'cat2']periodではない)で定義されたグループ内の結果のデータフレームをamountにソートします。
  • ['cat1', 'cat2']で定義された各グループ内の累積パーセンテージ列を追加します。 4つの値は、グループ内のある場合、すなわち、最も高い値は、二番目に高い値を0.5割り当てられます、0.25割り当てられます等

私は最初の2つの部分を行うことができ

df4 = df3.groupby(['cat1', 'cat2', 'period']).agg({ 
    "amount": "max" 
}) 

しかし今ではdf4['cat1', 'cat2', 'period']にマルチインデックスがあり、マルチインデックスで定義されたグループ内でソートする方法や、それらのグループ内で累積カウントを追加する方法がわかりません。

マルチインデックスを失うのは問題ありませんが(私はちょうどSQLテーブルにこれらのデータを挿入します)、効率的な方法があればそれを行う方法もわかりません。

私の望ましい結果は

cat1 cat2 period amount rank percentage 
A X 4   401  1  0.25 
A X 3   301  2  0.50 
A X 2   201  3  0.75 
A X 1   101  4  1.00 
A Y 4   411  1  0.25 
A Y 3   311  2  0.50 
A Y 2   211  3  0.75 
B X 4   421  4  1.00 
B X 3   321  1  0.25 
B X 2   221  2  0.50 
B X 1   121  3  0.75 
A Y 1   111  4  1.00 
B Y 4   431  1  0.25 
B Y 3   331  2  0.50 
B Y 2   231  3  0.75 
B Y 1   131  4  1.00 

です(私は実際に私はちょうど明確にするためそこを左に、rank列を必要としません。)

答えて

1

IIUC:

df4 = df3.groupby(['cat1', 'cat2', 'period']).agg({ 
    "amount": "max" 
}) 
df4.reset_index(inplace=True) 
df4 = df4.sort_values(by=['cat1','cat2','amount'],ascending=[True,True,False]) 
df4 = df4.assign(percentage=df4.groupby(['cat1','cat2'])['amount'].apply(lambda x: (x.notnull().cumsum()/x.size))) 
print(df4) 

出力:

cat1 cat2 period amount percentage 
3  A X  4  401  0.25 
2  A X  3  301  0.50 
1  A X  2  201  0.75 
0  A X  1  101  1.00 
7  A Y  4  411  0.25 
6  A Y  3  311  0.50 
5  A Y  2  211  0.75 
4  A Y  1  111  1.00 
11 B X  4  421  0.25 
10 B X  3  321  0.50 
9  B X  2  221  0.75 
8  B X  1  121  1.00 
15 B Y  4  431  0.25 
14 B Y  3  331  0.50 
13 B Y  2  231  0.75 
12 B Y  1  131  1.00 
関連する問題