如何在Python Pandas中按id分组并基于日期列生成排序序号列
在Pandas中按分组日期生成递增序号的实现方法
你可以通过分组结合计数/排名的方式快速实现需求,以下是两种实用方案:
方案1:分组后使用cumcount计数
cumcount()会对每个分组内的元素从0开始顺序计数,加1即可得到从1起始的序号。步骤如下:
- 先按
id和my_date升序排序,保证每个分组内日期从早到晚排列 - 按
id分组后调用cumcount()并加1,生成目标列col_x
代码示例:
import pandas as pd # 示例数据(替换为你的实际DataFrame即可) df = pd.DataFrame({ 'id': [111, 111, 111, 222, 222], 'my_date': pd.to_datetime(['2023-05-15', '2023-05-14', '2023-05-13', '2023-10-11', '2023-10-12']), 'col1': [1, 11, 2, 3, 55] }) # 排序后生成序号 df = df.sort_values(['id', 'my_date'], ascending=[True, True]) df['col_x'] = df.groupby('id').cumcount() + 1 # 若需要恢复原始行顺序,添加此步骤(可选) df = df.sort_index()
方案2:分组后使用rank直接排名
rank()方法可以直接对分组内的日期进行排名,指定ascending=True让最早日期对应1,method='first'可避免重复日期导致的排名冲突:
代码示例:
# 确保my_date是datetime类型(若未转换) df['my_date'] = pd.to_datetime(df['my_date']) # 直接生成序号 df['col_x'] = df.groupby('id')['my_date'].rank(method='first', ascending=True).astype(int)
补充说明
- 方案1需要先排序,若要保留原DataFrame的行顺序,最后需调用
sort_index();方案2无需排序,代码更简洁 - 如果你的数据中存在重复日期,
method='first'会按照行的先后顺序给重复日期分配不同的序号,若想让重复日期获得相同序号,可改为method='min'
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

