pandas 实现mysql 开窗函数组内排序操作(含空值)

pandas 实现mysql 开窗函数组内排序操作

row_number() over (partition by xx,yy order by mm asc ,nn desc ) as sos

# 导入数据
import pandas as pd
df = pd.read_excel(r'C:\Users\Administrator\Desktop\测试.xlsx')
df.head(15)
种类品牌top排名数量
0蒙脱石散方盛_蒙脱石散top1000199
1蒙脱石散康恩贝_蒙脱石散NaN200
2蒙脱石散康恩贝_蒙脱石散NaN35
3蒙脱石散思密达_蒙脱石散NaN54
4蒙脱石散康恩贝_蒙脱石散top100055
5以岭思密达_蒙脱石散top100056
6蒙脱石散方盛_蒙脱石散top100067
7蒙脱石散方盛_蒙脱石散NaN70
8蒙脱石散方盛_蒙脱石散NaN69
9以岭思密达_蒙脱石散top100088
10蒙脱石散思密达_蒙脱石散NaN32
11蒙脱石散康恩贝_蒙脱石散NaN68
12蒙脱石散康恩贝_蒙脱石散top10005
13以岭方盛_蒙脱石散top100078

一、分组后组内累计排序,数量都是分组后从高到低,排序累加

df1 = df.sort_values(["种类", "品牌", "top排名", "数量"], ascending=False)
df1.assign(rank=df1.assign(num=1).groupby(["种类", "品牌"], dropna=False)['num'].cumsum())
种类品牌top排名数量rank
0蒙脱石散方盛_蒙脱石散top10001991
6蒙脱石散方盛_蒙脱石散top1000672
7蒙脱石散方盛_蒙脱石散NaN703
8蒙脱石散方盛_蒙脱石散NaN694
3蒙脱石散思密达_蒙脱石散NaN541
10蒙脱石散思密达_蒙脱石散NaN322
4蒙脱石散康恩贝_蒙脱石散top1000551
12蒙脱石散康恩贝_蒙脱石散top100052
1蒙脱石散康恩贝_蒙脱石散NaN2003
11蒙脱石散康恩贝_蒙脱石散NaN684
2蒙脱石散康恩贝_蒙脱石散NaN355
13以岭方盛_蒙脱石散top1000781
9以岭思密达_蒙脱石散top1000881
5以岭思密达_蒙脱石散top1000562

二、分组后组内排序按小类排序,不累计连续

df1 = df.sort_values(["种类", "品牌", "top排名", "数量"], ascending=False)
df1["rank2"] =df1.groupby(["种类", "品牌", "top排名"], dropna=False).数量.rank(method="min", ascending=False,).astype("int")
df1
种类品牌top排名数量rank2
0蒙脱石散方盛_蒙脱石散top10001991
6蒙脱石散方盛_蒙脱石散top1000672
7蒙脱石散方盛_蒙脱石散NaN701
8蒙脱石散方盛_蒙脱石散NaN692
3蒙脱石散思密达_蒙脱石散NaN541
10蒙脱石散思密达_蒙脱石散NaN322
4蒙脱石散康恩贝_蒙脱石散top1000551
12蒙脱石散康恩贝_蒙脱石散top100052
1蒙脱石散康恩贝_蒙脱石散NaN2001
11蒙脱石散康恩贝_蒙脱石散NaN682
2蒙脱石散康恩贝_蒙脱石散NaN353
13以岭方盛_蒙脱石散top1000781
9以岭思密达_蒙脱石散top1000881
5以岭思密达_蒙脱石散top1000562
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值