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

如何为DataFrame按ID分组,基于Start Date生成Order编号列

问题描述

假设有如下DataFrame:

ID  Start Date
1   1990-01-01
1   1990-01-01
1   1991-01-01
2   1991-01-01
2   1990-01-01
3   2002-01-01
3   2000-01-01
4   1991-01-01

需要新增一列Order,规则为:对每个唯一的ID,最早的Start Date对应编号1,次早日期编号依次递增;若日期相同,编号顺序不限。最终目标DataFrame如下:

ID  Start Date  Order
1   1990-01-01  2
1   1990-01-01  3
1   1989-01-01  1
2   1991-01-01  2
2   1990-01-01  1
3   2002-01-01  2
3   2000-01-01  1
4   1991-01-01  1
最优实现方法

方法一:保留原数据顺序(推荐)

利用pandas的groupby结合rank方法,无需调整行顺序即可高效完成编号分配:

import pandas as pd

# 确保日期列是datetime类型(若原始数据为字符串格式)
df['Start Date'] = pd.to_datetime(df['Start Date'])

# 生成Order列
df['Order'] = df.groupby('ID')['Start Date'].rank(method='first', ascending=True).astype(int)
  • method='first':同日期的行按出现顺序分配不同的递增编号,满足“日期相同时顺序不限”的要求
  • ascending=True:让最早的日期对应编号1
  • astype(int):将rank返回的浮点型结果转为整数

方法二:先排序再编号

如果允许调整行顺序,也可以先按ID和Start Date排序,再用cumcount生成编号:

import pandas as pd

df['Start Date'] = pd.to_datetime(df['Start Date'])
# 按ID和日期升序排序
df_sorted = df.sort_values(['ID', 'Start Date'])
# 按ID分组后累加计数,加1让编号从1开始
df_sorted['Order'] = df_sorted.groupby('ID').cumcount() + 1
# 若需要恢复原始顺序,执行以下代码
df = df_sorted.sort_index()

内容的提问来源于stack exchange,提问作者Paulo Cortez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:12:13