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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 13:06:08