如何在Pandas DataFrame中按CLIENT_ID分组生成STAGE变化标记列
实现方案
你已经提前按照CLIENT_ID和ENCOUNTER_DATE完成排序的前提下,可以直接用分组位移比较的方式生成目标列,一行代码即可实现:
df['STAGE_WORSENED'] = (df['STAGE'] > df.groupby('CLIENT_ID')['STAGE'].shift(1)).astype(int)
逻辑说明
- 用
groupby('CLIENT_ID')对数据按客户ID拆分,保证不同客户的记录不会互相计算 - 对每组的
STAGE列调用shift(1),取该客户上一条就诊记录的阶段值,每个客户的第一条记录没有上一行数据,会返回空值 - 当前行
STAGE值大于上一行值时返回True,其余情况(阶段相等、阶段下降、无上行记录)都返回False - 用
astype(int)将布尔值转为整数,True对应1,False对应0,完全匹配你的标记规则
完整可运行代码
import pandas as pd # 生成样例DataFrame df = pd.DataFrame({"CLIENT_ID": [8222, 8222, 8222, 8222, 8300, 8300, 8300, 8300, 8300, 8400, 8401, 8401, 8500], "ENCOUNTER_DATE": ['2020-01-01', '2020-03-02', '2020-04-18', '2020-07-31', '2017-06-10', '2017-09-11', '2018-02-01', '2018-04-01', '2018-05-31', '2020-12-31', '2017-08-29', '2017-09-15', '2018-10-10'], "STAGE": [1, 1, 2, 1, 1, 2, 2, 3, 4, 1, 1, 3, 2]}) # 可选:如果数据未提前排序,先执行以下排序代码 # df = df.sort_values(['CLIENT_ID', 'ENCOUNTER_DATE']).reset_index(drop=True) # 生成目标列 df['STAGE_WORSENED'] = (df['STAGE'] > df.groupby('CLIENT_ID')['STAGE'].shift(1)).astype(int) # 打印结果验证 print(df)
运行后输出的结果和你给出的预期示例完全一致。
内容的提问来源于stack exchange,提问作者Mazil_tov998
相关产品推荐
相关产品推荐

