Pandas如何按ID分组从单日期列生成符合规则的起止日期特征
实现方案
你之前的代码没有按ID分组计算,会出现跨ID取值的问题,按以下代码修改即可:
import pandas as pd # 已按ID+Edit Date升序排序的前提下直接执行以下代码 # 生成End_Date列,直接取原Edit Date即可 df['End_Date'] = df['Edit Date'] # 按ID分组,组内取上一行的End_Date作为当前行Start_Date,组内首行的空值用当前End_Date填充 df['Start_Date'] = df.groupby('ID')['End_Date'].shift(1).fillna(df['End_Date']) # 可选:删除原始Edit Date列 df.drop('Edit Date', axis=1, inplace=True) # 如果还没做排序,先执行下面这句再跑上面的代码 # df = df.sort_values(['ID', 'Edit Date']).reset_index(drop=True)
逻辑说明
End_Date的取值就是当前行的原始Edit Date,不需要额外计算- 用
groupby('ID')保证所有计算都在同一个ID的范围内完成,不会跨ID取值 - 组内用
shift(1)取上一行的结束日期作为当前行的开始日期,组内第一条记录shift后会得到空值,用fillna直接填充为当前行的结束日期,刚好满足首行起止日期相同的要求 - 输出结果的列顺序可以按需调整,和你期望的输出结构完全匹配
内容的提问来源于stack exchange,提问作者Maku
相关产品推荐
相关产品推荐

