You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas DataFrame中按CLIENT_ID分组生成STAGE变化标记列

实现方案

你已经提前按照CLIENT_ID和ENCOUNTER_DATE完成排序的前提下,可以直接用分组位移比较的方式生成目标列,一行代码即可实现:

df['STAGE_WORSENED'] = (df['STAGE'] > df.groupby('CLIENT_ID')['STAGE'].shift(1)).astype(int)

逻辑说明

  1. 用groupby('CLIENT_ID')对数据按客户ID拆分,保证不同客户的记录不会互相计算
  2. 对每组的STAGE列调用shift(1),取该客户上一条就诊记录的阶段值,每个客户的第一条记录没有上一行数据,会返回空值
  3. 当前行STAGE值大于上一行值时返回True,其余情况(阶段相等、阶段下降、无上行记录)都返回False
  4. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:27:02