You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为Pandas数据框按司机分组生成独立的赛季递增顺序列

Pandas数据框按司机分组生成独立的赛季递增顺序列

我明白你想要实现的需求了——给每个司机的参赛赛季按先后顺序分配独立的序号,同一个司机的第一个赛季标1,第二个赛季标2,以此类推,不同司机的赛季序号互不干扰对吧?

先回顾下你的数据:

原始数据框

performancedriver_idseason
1117
2117
3217
4218
5218
6219
7117
8118
9118

目标数据框

performancedriver_idseasonseason_order
11171
21171
32171
42182
52182
62193
71171
81182
91182

你之前尝试的代码是同时按driver_id和season分组后rank,这样其实是在每个司机的同一个赛季组内排序,当然得不到跨赛季的递增序号。我们需要的是仅按driver_id分组,对组内的season值按数值大小分配连续的序号。

这里给你两种简单可行的方法:

方法一:使用groupby + rank(method='dense')

这种方法利用rank的dense参数,确保相同的season值得到相同的序号,且序号是连续递增的:

df['season_order'] = df.groupby('driver_id')['season'].rank(method='dense', ascending=True).astype(int)
  • method='dense':会给相同的season分配相同的序号,且下一个不同的season序号直接+1(不会跳号)
  • ascending=True:按season的数值从小到大排序分配序号,符合你目标里的逻辑
  • astype(int):把rank得到的浮点数转为整数,和目标格式一致

方法二:使用groupby + factorize

factorize可以把组内的唯一值映射为连续的整数,正好符合我们的需求:

import pandas as pd
df['season_order'] = df.groupby('driver_id')['season'].transform(
    lambda x: pd.factorize(x.sort_values())[0] + 1
)
  • x.sort_values():先对组内的season排序,确保序号按赛季先后分配
  • pd.factorize()[0]:得到从0开始的连续整数,加1后变成从1开始的序号

这两种方法都能得到你想要的目标数据框,你可以根据自己的习惯选择使用。

备注:内容来源于stack exchange,提问作者Eoin Vaughan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:59:50