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])
を持っているがcat1
、cat2
、および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
列を必要としません。)