Python 如何在多索引中排序和添加秩列?

Python 如何在多索引中排序和添加秩列?,python,pandas,Python,Pandas,我有一个熊猫数据帧,看起来像这样(df3) 我想做的是 根据cat1、cat2和period的值分成组 筛选到每个组中具有maxamount值的行 在['cat1','cat2']定义的组内,按金额对生成的数据帧进行排序(不是期间) 在['cat1',cat2']定义的每个组中添加累积百分比列。也就是说,如果组内有4个值,则分配最高值0.25,分配第二高值0.5,以此类推 我可以用计算机完成前两部分 df4 = df3.groupby(['cat1', 'cat2', 'period']).

我有一个熊猫数据帧,看起来像这样(
df3

我想做的是

  • 根据
    cat1
    cat2
    period
    的值分成组
  • 筛选到每个组中具有max
    amount
    值的行
  • ['cat1','cat2']
    定义的组内,按
    金额对生成的数据帧进行排序(不是
    期间
  • ['cat1',cat2']
    定义的每个组中添加累积百分比列。也就是说,如果组内有4个值,则分配最高值
    0.25
    ,分配第二高值
    0.5
    ,以此类推
我可以用计算机完成前两部分

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
(我实际上不需要
排名
列,我只是为了清楚起见把它放在那里。)

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
   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