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']
金额对生成的数据帧进行排序(不是
)期间
- 在
定义的每个组中添加累积百分比列。也就是说,如果组内有4个值,则分配最高值['cat1',cat2']
,分配第二高值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