在DataFrame上优化用于200K行迭代的Python脚本

在DataFrame上优化用于200K行迭代的Python脚本,python,pandas,dataframe,Python,Pandas,Dataframe,我编写了下面的代码来迭代数据帧(df_final_exheader),获取文件路径并从相应的图像读取元数据。在这一点上,我感觉比需要的慢,但我很难找到解决方案(我有非程序员背景,可能缺乏基本知识) 如果我是正确的,其中一个问题是使用.iterrows,reading Guide在数据帧上循环。我认为我需要实现矢量化,但我不知道如何处理这个问题。有人能帮我朝正确的方向轻轻推一下吗 def read_dicom_header(input_dir_im, df_final_exheader):

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

如果我是正确的,其中一个问题是使用.iterrows,reading Guide在数据帧上循环。我认为我需要实现矢量化,但我不知道如何处理这个问题。有人能帮我朝正确的方向轻轻推一下吗

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

看来我误解了矢量化在这种情况下的相关性。当前版本正在运行,当它完成后,我将对其进行调整,看看可以在多大程度上进行改进

跟进;我终于有时间在timeit下运行一些变体

  • 原始代码;2.654秒

  • 按照@roganjosh的建议,Dict提出动议;2.618秒

  • 不包括@Cammeron Riddle建议的像素数据;2.340秒

结束;最初的脚本运行了48小时,经过修改后,本可以提高到42小时


再次;谢谢大家的意见!:)

毫无疑问,我很确定你无法将其矢量化,因为它正在调用外部库来读取文件。一个超小型的改进是将
头目录
从循环中拉出,无需继续重新定义它。为了澄清,df\u final\u exheader是一个包含200k DICOM路径的数据帧?必须加载每个标签,并检查指定标签的标题?我觉得我一定是误会了什么。我的猜测是,用dicom.dcmread()加载dicom是一个瓶颈,但不幸的是,我认为这方面没有什么可做的。如果您只需要dicom文件中的一些元数据,也许你可以试着在打电话时加入
stop\u before\u pixels=True
,我同意其他评论的说法,读dicom可能会让你慢下来,而不是数据帧迭代。谢谢大家的输入,我担心在这种情况下我可能会误解矢量化的相关性@roganjosh说的对,我需要注意一下。这个脚本已经运行了一整夜,大约是整个过程的1/3,考虑到你的评论,我会让它运行,然后尝试调整,只是为了从中学习!