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

如何统计手术日期前6个月内患者手术次数并生成Readmission列

问题:计算患者手术前6个月内的手术次数(新增Readmission列)

我注意到你需要给医疗数据集新增一列Readmission,用来统计每个患者在本次手术日期前6个月内的手术次数,但当前代码的计算结果不符合预期。下面我们一步步解决这个问题:

现有数据

Patient_IDSurgery_Date
18382017-01-05
18382018-04-26
872017-01-11
18382017-07-06
872017-03-17
18382018-08-02
872017-11-15
18382018-11-22
872017-02-01
872017-06-21
18382018-06-14

期望结果

Patient_IDSurgery_DateReadmission
18382017-01-050
18382018-04-260
872017-01-110
18382017-07-060
872017-03-172
18382018-08-022
872017-11-151
18382018-11-222
872017-02-011
872017-06-213
18382018-06-141

当前代码的问题根源

你写的代码逻辑是基于相邻手术的间隔是否小于180天来累加计数,比如(n_admissions[-1]+1)*v这行:当相邻间隔<180天时,计数在上一个值基础上加1;否则重置为0。但这和你的需求完全不符——你需要的是统计当前手术日期前6个月窗口内的所有历史手术次数,而不是连续间隔的累加计数。

举个例子:Patient_ID=87的2017-11-15手术,前6个月的起始日期是2017-05-15,只有2017-06-21这次手术在窗口内,所以正确计数是1;但原代码会因为之前几次手术间隔都<180天,累加得到4,这显然错误。

修正后的代码

下面是基于你的需求重新编写的代码,核心逻辑是对每个患者的手术日期,逐个统计当前日期前6个月窗口内的历史手术次数:

import pandas as pd

# 初始化你的实际数据集
data = {
    'Patient_ID': [1838, 1838, 87, 1838, 87, 1838, 87, 1838, 87, 87, 1838],
    'Surgery_Date': [
        '2017-01-05', '2018-04-26', '2017-01-11', '2017-07-06',
        '2017-03-17', '2018-08-02', '2017-11-15', '2018-11-22',
        '2017-02-01', '2017-06-21', '2018-06-14'
    ]
}

df = pd.DataFrame(data)
# 将手术日期转换为datetime类型,方便时间计算
df['Surgery_Date'] = pd.to_datetime(df['Surgery_Date'])

# 定义函数:针对单个患者的所有手术日期,计算每个日期对应的Readmission值
def calculate_readmissions(patient_dates):
    readmission_counts = []
    for current_date in patient_dates:
        # 计算6个月窗口的起始时间(当前日期往前推180天)
        window_start = current_date - pd.Timedelta(days=180)
        # 统计窗口内的历史手术次数(仅包含早于当前日期的记录)
        count = len(patient_dates[(patient_dates >= window_start) & (patient_dates < current_date)])
        readmission_counts.append(count)
    # 返回带有原索引的Series,确保能正确合并回原数据框
    return pd.Series(readmission_counts, index=patient_dates.index)

# 按Patient_ID分组应用函数,生成Readmission列
df['Readmission'] = df.groupby('Patient_ID')['Surgery_Date'].apply(calculate_readmissions).reset_index(level=0, drop=True)

# 可选:按Patient_ID和手术日期排序,方便和期望结果对比
df_sorted = df.sort_values(by=['Patient_ID', 'Surgery_Date']).reset_index(drop=True)
print(df_sorted)

代码验证

运行上述代码后,得到的结果完全匹配你的期望:

  • Patient_ID=87、手术日期2017-11-15的Readmission值为1
  • Patient_ID=1838、手术日期2018-11-22的Readmission值为2

所有记录的计数都符合“手术日期前6个月内的历史手术次数”的需求。

内容的提问来源于stack exchange,提问作者bonaqua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:02:47