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 | 蒙脱石散 | 方盛_蒙脱石散 | top1000 | 199 |
---|
1 | 蒙脱石散 | 康恩贝_蒙脱石散 | NaN | 200 |
---|
2 | 蒙脱石散 | 康恩贝_蒙脱石散 | NaN | 35 |
---|
3 | 蒙脱石散 | 思密达_蒙脱石散 | NaN | 54 |
---|
4 | 蒙脱石散 | 康恩贝_蒙脱石散 | top1000 | 55 |
---|
5 | 以岭 | 思密达_蒙脱石散 | top1000 | 56 |
---|
6 | 蒙脱石散 | 方盛_蒙脱石散 | top1000 | 67 |
---|
7 | 蒙脱石散 | 方盛_蒙脱石散 | NaN | 70 |
---|
8 | 蒙脱石散 | 方盛_蒙脱石散 | NaN | 69 |
---|
9 | 以岭 | 思密达_蒙脱石散 | top1000 | 88 |
---|
10 | 蒙脱石散 | 思密达_蒙脱石散 | NaN | 32 |
---|
11 | 蒙脱石散 | 康恩贝_蒙脱石散 | NaN | 68 |
---|
12 | 蒙脱石散 | 康恩贝_蒙脱石散 | top1000 | 5 |
---|
13 | 以岭 | 方盛_蒙脱石散 | top1000 | 78 |
---|
一、分组后组内累计排序,数量都是分组后从高到低,排序累加
df1 = df.sort_values(["种类", "品牌", "top排名", "数量"], ascending=False)
df1.assign(rank=df1.assign(num=1).groupby(["种类", "品牌"], dropna=False)['num'].cumsum())
| 种类 | 品牌 | top排名 | 数量 | rank |
---|
0 | 蒙脱石散 | 方盛_蒙脱石散 | top1000 | 199 | 1 |
---|
6 | 蒙脱石散 | 方盛_蒙脱石散 | top1000 | 67 | 2 |
---|
7 | 蒙脱石散 | 方盛_蒙脱石散 | NaN | 70 | 3 |
---|
8 | 蒙脱石散 | 方盛_蒙脱石散 | NaN | 69 | 4 |
---|
3 | 蒙脱石散 | 思密达_蒙脱石散 | NaN | 54 | 1 |
---|
10 | 蒙脱石散 | 思密达_蒙脱石散 | NaN | 32 | 2 |
---|
4 | 蒙脱石散 | 康恩贝_蒙脱石散 | top1000 | 55 | 1 |
---|
12 | 蒙脱石散 | 康恩贝_蒙脱石散 | top1000 | 5 | 2 |
---|
1 | 蒙脱石散 | 康恩贝_蒙脱石散 | NaN | 200 | 3 |
---|
11 | 蒙脱石散 | 康恩贝_蒙脱石散 | NaN | 68 | 4 |
---|
2 | 蒙脱石散 | 康恩贝_蒙脱石散 | NaN | 35 | 5 |
---|
13 | 以岭 | 方盛_蒙脱石散 | top1000 | 78 | 1 |
---|
9 | 以岭 | 思密达_蒙脱石散 | top1000 | 88 | 1 |
---|
5 | 以岭 | 思密达_蒙脱石散 | top1000 | 56 | 2 |
---|
二、分组后组内排序按小类排序,不累计连续
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 | 蒙脱石散 | 方盛_蒙脱石散 | top1000 | 199 | 1 |
---|
6 | 蒙脱石散 | 方盛_蒙脱石散 | top1000 | 67 | 2 |
---|
7 | 蒙脱石散 | 方盛_蒙脱石散 | NaN | 70 | 1 |
---|
8 | 蒙脱石散 | 方盛_蒙脱石散 | NaN | 69 | 2 |
---|
3 | 蒙脱石散 | 思密达_蒙脱石散 | NaN | 54 | 1 |
---|
10 | 蒙脱石散 | 思密达_蒙脱石散 | NaN | 32 | 2 |
---|
4 | 蒙脱石散 | 康恩贝_蒙脱石散 | top1000 | 55 | 1 |
---|
12 | 蒙脱石散 | 康恩贝_蒙脱石散 | top1000 | 5 | 2 |
---|
1 | 蒙脱石散 | 康恩贝_蒙脱石散 | NaN | 200 | 1 |
---|
11 | 蒙脱石散 | 康恩贝_蒙脱石散 | NaN | 68 | 2 |
---|
2 | 蒙脱石散 | 康恩贝_蒙脱石散 | NaN | 35 | 3 |
---|
13 | 以岭 | 方盛_蒙脱石散 | top1000 | 78 | 1 |
---|
9 | 以岭 | 思密达_蒙脱石散 | top1000 | 88 | 1 |
---|
5 | 以岭 | 思密达_蒙脱石散 | top1000 | 56 | 2 |
---|