搭建Pandas DataFrame统计听神经瘤体积并计算肿瘤倍增时间方案咨询
听神经瘤Gamma Knife治疗随访体积数据分析落地方案
一、数据录入优化方案(替代FileMaker Pro,无额外license需求)
- 优先用医院内网Office 365自带的Microsoft Lists建录入表单,不需要额外站点license,设置四个字段即可:患者ID(文本)、扫描日期(日期型)、肿瘤体积(mm³)(数字型)、是否为治疗后扫描(是/否选项),给所有录入人员开编辑权限,自动避免格式填错,数据直接就能导出为CSV,完全不会出现多人编辑冲突的问题。
- 无Office 365的话用共享文件夹存Excel,按长表结构设计,每一行对应单次扫描记录,不要用一行存患者所有扫描数据的宽表结构,录入更简便,后续数据处理不需要额外转格式。
- 导出数据时直接存为UTF-8编码的CSV即可,无需额外格式调整。
二、Pandas数据处理实现(复制可用,无需复杂代码基础)
先安装Anaconda,自带Pandas、Numpy等所需工具,无需额外配置环境,以下代码直接复制修改文件路径就能运行:
import pandas as pd import numpy as np # 导入数据,自动识别扫描日期为时间格式 df = pd.read_csv("你的CSV文件路径.csv", parse_dates=["扫描日期"]) # 按患者ID、扫描日期排序,保证时间顺序正确 df = df.sort_values(by=["患者ID", "扫描日期"]).reset_index(drop=True) # 拆分治疗前、治疗后数据集 pre_treatment_df = df[df["是否为治疗后扫描"] == "否"].copy() post_treatment_df = df[df["是否为治疗后扫描"] == "是"].copy()
三、体积倍增时间自动计算
采用临床通用的体积倍增时间公式:VDT = (t2 - t1) * log(2) / log(V2/V1),其中t1、t2为两次扫描的时间,V1、V2为对应时间点的肿瘤体积,仅计算体积增长的区间,代码如下:
def calculate_vdt(patient_group): # 对单个患者的所有扫描记录按日期排序 patient_group = patient_group.sort_values("扫描日期") result = [] # 遍历所有相邻两次扫描记录 for i in range(1, len(patient_group)): t1 = patient_group.iloc[i-1]["扫描日期"] t2 = patient_group.iloc[i]["扫描日期"] v1 = patient_group.iloc[i-1]["肿瘤体积(mm³)"] v2 = patient_group.iloc[i]["肿瘤体积(mm³)"] # 仅统计体积增长的区间 if v2 > v1: # 计算时间差,转换为年为单位 days_gap = (t2 - t1).days years_gap = days_gap / 365.25 # 计算倍增时间保留两位小数 vdt = round(years_gap * np.log(2) / np.log(v2 / v1), 2) result.append({ "患者ID": patient_group.name, "首次扫描日期": t1, "二次扫描日期": t2, "首次体积(mm³)": v1, "二次体积(mm³)": v2, "倍增时间(年)": vdt }) return pd.DataFrame(result) # 分别计算治疗前、治疗后的倍增时间 pre_treatment_vdt = pre_treatment_df.groupby("患者ID", group_keys=False).apply(calculate_vdt) post_treatment_vdt = post_treatment_df.groupby("患者ID", group_keys=False).apply(calculate_vdt) # 结果导出为Excel,直接用于研究分析 with pd.ExcelWriter("听神经瘤倍增时间分析结果.xlsx") as writer: pre_treatment_vdt.to_excel(writer, sheet_name="治疗前倍增时间", index=False) post_treatment_vdt.to_excel(writer, sheet_name="治疗后倍增时间", index=False)
- 若单个患者存在多个体积增长区间,代码会自动生成每一段的倍增时间,可按需取平均值、治疗前最后一段或治疗后第一段的数值做后续统计。
内容的提问来源于stack exchange,提问作者capnahab
相关产品推荐
相关产品推荐

