如何获取dataframe中列值发生变更对应的生效日期
实现方案
核心逻辑为按用户分组后按时间排序,识别value字段的变更节点,对应赋值生效日期:
- 先按
id、name分组,对每个用户的所有记录按filedate升序排序,保证时序正确 - 标记
value和上一行不一致的变更行,每个用户的首条记录默认作为首个生效节点 - 首条记录的生效日期取
startdate,后续所有变更行的生效日期取对应行的filedate - 提取指定字段输出结果即可
示例实现代码(基于pandas):
import pandas as pd # 第一步:先将日期字段转为标准日期格式,原始数据的df命名为raw_df raw_df['filedate'] = pd.to_datetime(raw_df['filedate']) raw_df['startdate'] = pd.to_datetime(raw_df['startdate']) # 第二步:按用户+文件日期排序 sorted_df = raw_df.sort_values(by=['id', 'name', 'filedate']).reset_index(drop=True) # 第三步:标记value发生变更的行 sorted_df['value_changed'] = sorted_df.groupby(['id', 'name'])['value'].diff().ne(0) # 第四步:筛选出每个用户的首条记录+所有变更行 result_df = sorted_df[(sorted_df['value_changed']) | (sorted_df.groupby(['id', 'name']).cumcount() == 0)].copy() # 第五步:赋值生效日期 result_df['effective date'] = result_df.apply( lambda x: x['startdate'] if sorted_df.loc[x.name-1, 'id'] != x['id'] else x['filedate'], axis=1 ) # 第六步:提取要求的输出字段 result_df = result_df[['id', 'name', 'effective date', 'value']].reset_index(drop=True)
注意事项
- 若
value为字符串等非数值类型,将标记变更行的代码替换为sorted_df['value_changed'] = sorted_df.groupby(['id', 'name'])['value'].shift().ne(sorted_df['value'])即可兼容 - 若存在同一用户同一
filedate下多条重复value的记录,可先执行raw_df = raw_df.drop_duplicates(subset=['id', 'name', 'filedate', 'value'])去重,避免生成冗余生效记录
内容的提问来源于stack exchange,提问作者Hacendado
相关产品推荐
相关产品推荐

