在CTR比赛中,我们常常会使用“第几次交互”、“倒数第几次交互”等特征,这就需要使用到排序功能。
rank函数极为方便。
rank函数返回从小到大排序的下标
df = pd.DataFrame({'A':['a','b']*4, 'B':[4,6,2,8,5,2,9,1]})
df['rank'] = df.groupby('A')['B'].rank()
print(df)
A B rank
0 a 4 2.0
1 b 6 3.0
2 a 2 1.0
3 b 8 4.0
4 a 5 3.0
5 b 2 2.0
6 a 9 4.0
7 b 1 1.0
-
rank
函数有method
参数,下表展示了该参数的选项,默认为average
,该参数在含有重复值时候能显露出来
method
=average
默认设置: 相同的值占据前两名,分不出谁是1谁是2,那么去中值即1.5,下面一名为第三名
df = pd.DataFrame({'A':[1,1,2,2,3,3,4,4]})
df['rank'] = df.A.rank()
print(df)
A rank
0 1 1.5
1 1 1.5
2 2 3.5
3 2 3.5
4 3 5.5
5 3 5.5
6 4 7.5
7 4 7.5
-
method
=max
: 两人并列第 2 名,下一个人是第 3 名。
df = pd.DataFrame({'A':[1,1,2,2,3,3,4,4]})
df['rank'] = df.A.rank(method='max')
print(df)
A rank
0 1 2.0
1 1 2.0
2 2 4.0
3 2 4.0
4 3 6.0
5 3 6.0
6 4 8.0
7 4 8.0
-
method
=min
: 两人并列第 1 名,下一个人是第 3 名。
df = pd.DataFrame({'A':[1,1,2,2,3,3,4,4]})
df['rank'] = df.A.rank(method='min')
print(df)
A rank
0 1 1.0
1 1 1.0
2 2 3.0
3 2 3.0
4 3 5.0
5 3 5.0
6 4 7.0
7 4 7.0
-
method
=dense
: 两人并列第1名,下一个人是第 2 名。
df = pd.DataFrame({'A':[1,1,2,2,3,3,4,4]})
df['rank'] = df.A.rank(method='dense')
print(df)
A rank
0 1 1.0
1 1 1.0
2 2 2.0
3 2 2.0
4 3 3.0
5 3 3.0
6 4 4.0
7 4 4.0
-
method
=first
: 相同值会按照其在序列中的相对位置定值
df = pd.DataFrame({'A':[1,4,3,2,2,3,4,1]})
df['rank'] = df.A.rank(method='first')
print(df)
A rank
0 1 1.0
1 4 7.0
2 3 5.0
3 2 3.0
4 2 4.0
5 3 6.0
6 4 8.0
7 1 2.0
- 如果需要进行倒序,使用参数
ascending=False
df = pd.DataFrame({'A':[1,1,2,2,3,3,4,4]})
df['rank'] = df.A.rank(method='max',ascending=False)
print(df)
A rank
0 1 8.0
1 1 8.0
2 2 6.0
3 2 6.0
4 3 4.0
5 3 4.0
6 4 2.0
7 4 2.0