首页 > 解决方案 > 优化 Python 脚本以在 pandas DataFrame 上进行 200K 行迭代

问题描述

我编写了下面的代码来迭代数据帧(df_final_exheader),获取文件路径并从相应的图像中读取元数据。在这一点上感觉比它需要的要慢,但我很难找到解决方案(我有非程序员背景,可能缺乏基本知识)。

如果我是正确的,其中一个问题是使用.iterrows在数据帧上循环,阅读指南我认为我需要实现矢量化,但我不知道如何选择它。有人可以在正确的方向上轻轻推动我吗?

def read_dicom_header(input_dir_im, df_final_exheader):
        i = 0
        for row,index in df_final_exheader.iterrows():
    
            ds = dicom.dcmread(os.path.join(input_dir_im,df_final_exheader.loc[row, 'path']))
            
            header_dict = {'kVp':[0x18,0x60],'uAs':[0X18,0x1153],'EI':[0x18,0x1411],'DAP':[0x18,0x115E],'REX':[0x18, 0x1405]}
            
            for key, val in header_dict.items():
    
                try:
                    df_final_exheader.loc[row, key] = ds[[hex(x) for x in val]].value
                except KeyError:
                    df_final_exheader.loc[row, key] = 'na'
            
            i+=1
            if i%500==0:
                print(row)
                        
        return df_final_exheader

标签: pythonpandasdataframe

解决方案


在这种情况下,我似乎误解了矢量化的相关性。当前版本正在运行,完成后我会对其进行调整,看看可以改进到什么程度。

跟进; 我终于有时间在 timeit 下运行几个变种;

  • 原始代码;2.654 秒。

  • 按照@roganjosh 的建议移动了字典;2.618 秒。

  • 排除@Cammeron Riddle 建议的像素数据;2.340 秒。

总结;原始脚本运行了 48 小时,经过修改后可以改进为 42 小时。

再次; 感谢大家的意见和建议!:)


推荐阅读