我的数据类似,我想计算NDCG
指标
pid query title label predict prob
0 1 A a 0 2 0.9
1 1 A b 2 0 0.8
2 1 A c 1 2 0.7
3 2 D d 3 1 0.8
4 2 D e 4 2 0.9
groupby
操作后
each_pid = data.groupby(data['pid']).apply(lambda g: g.sort_values(['predict', 'prob'], ascending=False))
我有一个像这样的数据框架。
pid query title label predict prob score
pid
1 0 1 A a 0 2 0.9 6
2 1 A c 1 2 0.7 18
1 1 A b 2 0 0.8 42
2 4 2 D e 4 2 0.9 186
3 2 D d 3 1 0.8 90
现在我想要另一个列名weight
,其值取决于每个组的顺序如下。
pid query title label predict prob score weight
pid
1 0 1 A a 0 2 0.9 6 1
2 1 A c 1 2 0.7 18 2
1 1 A b 2 0 0.8 42 3
2 4 2 D e 4 2 0.9 186 1
3 2 D d 3 1 0.8 90 2
如何获得每组的前2行,如
pid query title label predict prob score weight
pid
1 0 1 A a 0 2 0.9 6 1
2 1 A c 1 2 0.7 18 2
2 4 2 D e 4 2 0.9 186 1
3 2 D d 3 1 0.8 90 2
有人可以帮忙吗?
EDIT。感谢@Akshay Kandul和@Allen的帮助。代码作为
data = data.groupby(level=0).head(2)
data['weight'] = data.groupby(level=0).cumcount()+1
答案 0 :(得分:3)
您可以在分组级别为零的分组上使用cumcount函数
each_pid['weight'] = each_pid.groupby(level=[0]).cumcount()
输出
label pid predict prob query title weight
pid
1 0 0 1 2 0.9 A a 0
2 1 1 2 0.7 A c 1
1 2 1 0 0.8 A b 2
2 4 4 2 2 0.9 D e 0
3 3 2 1 0.8 D d 1
如果你真的希望它从1开始,那么就这样做:
each_pid['weight'] = each_pid.groupby(level=[0]).cumcount()+1
输出
label pid predict prob query title weight
pid
1 0 0 1 2 0.9 A a 1
2 1 1 2 0.7 A c 2
1 2 1 0 0.8 A b 3
2 4 4 2 2 0.9 D e 1
3 3 2 1 0.8 D d 2
如果您需要每组的前2条记录,则可以使用以下代码:
print(each_pid.groupby(level=0).head(2))
答案 1 :(得分:1)
根据您已经获得的each_pid,您可以使用apply来计算订单:
each_pid['weight'] = \
(
each_pid.groupby(level=0)
.apply(lambda x: pd.Series(range(1,len(x)+1)))
.values
)
each_pid
Out[263]:
pid query title label predict prob weight
pid
1 0 1 A a 0 2 0.9 1
2 1 A c 1 2 0.7 2
1 1 A b 2 0 0.8 3
2 4 2 D e 4 2 0.9 1
3 2 D d 3 1 0.8 2
如果你需要每组的前2名,你可以这样做:
each_pid.groupby(level=0).head(2)
Out[273]:
pid query title label predict prob weight
pid
1 0 1 A a 0 2 0.9 1
2 1 A c 1 2 0.7 2
2 4 2 D e 4 2 0.9 1
3 2 D d 3 1 0.8 2