如何统计手术日期前6个月内患者手术次数并生成Readmission列
问题:计算患者手术前6个月内的手术次数(新增Readmission列)
我注意到你需要给医疗数据集新增一列Readmission,用来统计每个患者在本次手术日期前6个月内的手术次数,但当前代码的计算结果不符合预期。下面我们一步步解决这个问题:
现有数据
| Patient_ID | Surgery_Date |
|---|---|
| 1838 | 2017-01-05 |
| 1838 | 2018-04-26 |
| 87 | 2017-01-11 |
| 1838 | 2017-07-06 |
| 87 | 2017-03-17 |
| 1838 | 2018-08-02 |
| 87 | 2017-11-15 |
| 1838 | 2018-11-22 |
| 87 | 2017-02-01 |
| 87 | 2017-06-21 |
| 1838 | 2018-06-14 |
期望结果
| Patient_ID | Surgery_Date | Readmission |
|---|---|---|
| 1838 | 2017-01-05 | 0 |
| 1838 | 2018-04-26 | 0 |
| 87 | 2017-01-11 | 0 |
| 1838 | 2017-07-06 | 0 |
| 87 | 2017-03-17 | 2 |
| 1838 | 2018-08-02 | 2 |
| 87 | 2017-11-15 | 1 |
| 1838 | 2018-11-22 | 2 |
| 87 | 2017-02-01 | 1 |
| 87 | 2017-06-21 | 3 |
| 1838 | 2018-06-14 | 1 |
当前代码的问题根源
你写的代码逻辑是基于相邻手术的间隔是否小于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
相关产品推荐
相关产品推荐

