如何按CASEID分组偏移DATESTART生成DATEEND,且每组末行保留原日期
解决方案:为日志数据生成DATEEND列
核心需求:对每个CASEID分组,DATEEND取同组下一行的DATESTART;每组最后一行的DATEEND与该行DATESTART保持一致。
输入数据
CASEID ACTIVITYID DATESTART 725/2022 _0 2022-03-09 725/2022 0F 2022-03-23 725/2022 YB 2022-06-21 725/2022 AA 2022-06-28 725/2022 1F 2022-06-28 725/2022 2B 2022-06-29 444/2022 AA 2022-07-26 444/2022 1F 2022-07-28 444/2022 2B 2022-07-28
实现代码
使用Pandas的groupby+shift(-1)结合fillna即可完成需求,代码如下:
import pandas as pd # 加载数据(这里模拟输入数据,实际可通过read_csv等方法读取) df = pd.DataFrame({ 'CASEID': ['725/2022']*6 + ['444/2022']*3, 'ACTIVITYID': ['_0', '0F', 'YB', 'AA', '1F', '2B', 'AA', '1F', '2B'], 'DATESTART': ['2022-03-09', '2022-03-23', '2022-06-21', '2022-06-28', '2022-06-28', '2022-06-29', '2022-07-26', '2022-07-28', '2022-07-28'] }) # 1. 按CASEID分组,将DATESTART下移一行得到DATEEND初始值 df['DATEEND'] = df.groupby('CASEID')['DATESTART'].shift(-1) # 2. 填充每组最后一行的空值,用当前行DATESTART替换 df['DATEEND'] = df['DATEEND'].fillna(df['DATESTART']) # 打印结果 print(df.to_string(index=False))
输出结果
CASEID ACTIVITYID DATESTART DATEEND 725/2022 _0 2022-03-09 2022-03-23 725/2022 0F 2022-03-23 2022-06-21 725/2022 YB 2022-06-21 2022-06-28 725/2022 AA 2022-06-28 2022-06-28 725/2022 1F 2022-06-28 2022-06-29 725/2022 2B 2022-06-29 2022-06-29 444/2022 AA 2022-07-26 2022-07-28 444/2022 1F 2022-07-28 2022-07-28 444/2022 2B 2022-07-28 2022-07-28
关键说明
shift(-1)会将每组的DATESTART向下偏移一行,每组最后一行会生成NaN;fillna(df['DATESTART'])直接用当前行的DATESTART填充空值,完美匹配每组最后一行的需求;- 若
DATESTART是日期类型(非字符串),该方法无需额外修改即可生效。
内容的提问来源于stack exchange,提问作者mattiadt
相关产品推荐
相关产品推荐

