使用Python或Pandas从影像文件名提取聚合患者数据并校验ID交叉
实现思路
前置优化:文件名拆分方式
建议不要用固定位置切片提取ID,改用split('-')方法适配所有病种,拆分逻辑更通用:
# 单文件名拆分示例 file_name = "CNV-9911627-77.jpeg" disease, patient_id, img_seq = file_name.split('.')[0].split('-') img_seq = int(img_seq) # 把序号转成数值方便后续算最大值
问题1:统计各列表内患者的影像数量
直接用字典计数即可,四个病种列表的处理逻辑完全一致:
from collections import defaultdict def count_patient_imgs(img_list): count_dict = defaultdict(int) for file in img_list: patient_id = file.split('-')[1] count_dict[patient_id] += 1 return count_dict # 调用示例 cnv_patient_count = count_patient_imgs(train_cnv_list) dme_patient_count = count_patient_imgs(train_dme_list) drusen_patient_count = count_patient_imgs(train_drusen_list) normal_patient_count = count_patient_imgs(train_normal_list)
输出的字典key为患者ID,value为对应患者的影像数量。
问题2:校验患者ID交叉+生成聚合报告
用pandas的groupby实现最方便,步骤如下:
步骤1:汇总所有文件的结构化信息
import pandas as pd # 先把四个列表和对应病种做映射,方便批量处理 disease_map = [ ("CNV", train_cnv_list), ("DME", train_dme_list), ("DRUSEN", train_drusen_list), ("NORMAL", train_normal_list) ] all_data = [] for disease, img_list in disease_map: for file in img_list: parts = file.split('.')[0].split('-') patient_id = parts[1] img_seq = int(parts[2]) all_data.append([patient_id, disease, img_seq]) # 转成DataFrame df = pd.DataFrame(all_data, columns=['patient_id', 'disease', 'img_seq'])
步骤2:校验ID交叉
# 统计每个患者关联的病种数,大于1就是存在跨病种的交叉ID patient_disease_cnt = df.groupby('patient_id')['disease'].nunique() cross_patients = patient_disease_cnt[patient_disease_cnt>1].index.tolist() print(f"存在交叉的患者ID共{len(cross_patients)}个:{cross_patients}")
步骤3:生成要求格式的聚合报告
# 按患者ID、病种分组,取序号最大值作为该病种下的影像总数 report_df = df.groupby(['patient_id', 'disease'])['img_seq'].max().reset_index(name='img_total') # 输出指定格式的报告 for patient in report_df['patient_id'].unique(): patient_records = report_df[report_df['patient_id']==patient] first_line = True for _, row in patient_records.iterrows(): if first_line: print(f"{row['patient_id']} - {row['disease']} - {row['img_total']}") first_line = False else: print(f" - {row['disease']} - {row['img_total']}")
内容的提问来源于stack exchange,提问作者Yogesh Riyat
相关产品推荐
相关产品推荐

