如何为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:让最早的日期对应编号1astype(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
相关产品推荐
相关产品推荐

