如何根据.CSV映射重命名文件

时间:2018-12-13 14:29:51

标签: python-3.x pandas csv rename

这里是数据科学的障碍...我需要根据具有972个文件的多个属性的.csv文件重命名972个文件。

它们有一个共同点,就是Image Data ID列的值。 在文件名中,该数字(6位数字)出现在名称的最后部分,即“ .nii”之前。

我已将.csv文件加载到Pandas datafreme中。这是一个看起来像的例子:

    Image Data ID   Subject Group   Visit   Description
516 277576  027_S_2245  EMCI    4   ACCELERATED SAG IR-SPGR
525 342645  027_S_2183  EMCI    4   ACCELERATED SAG IR-SPGR
1   292394  131_S_0123  CN  26  Accelerated SAG IR-SPGR
3   475763  131_S_0123  CN  32  Accelerated SAG IR-SPGR
4   413872  131_S_0123  CN  30  Accelerated SAG IR-SPGR

也许以图像格式更容易理解:

enter image description here

文件名在列表中列出,通过以下方式完成:

files = os.listdir("path/to/files")

以下是文件名的示例:

ADNI_098_S_4215_MR_Sag_IR-SPGR__br_raw_20130206130502189_10_S173103_I343697.nii
ADNI_094_S_2201_MR_Accelerated_SAG_IR-SPGR__br_raw_20120119112855332_188_S137442_I279199.nii
ADNI_127_S_4240_MR_Sag_IR-SPGR__br_raw_20120925151831011_194_S168683_I336697.nii

因此,从本质上讲,我想要做的是通过Image Data ID的值在其相应的.CSV行中标识一个文件,然后将其重命名为:

EMCI_027_S_2245_4_Accelerated.nii

CN_134_S_0233_32_Normal.nii

(取决于Description的单词是否已加速)

关于如何处理此问题的任何建议?

1 个答案:

答案 0 :(得分:2)

据我所见,这就是我的建议:

-制作一个从文件的旧名称中提取image_data_id的函数(如果您所有的ID都具有相同的大小(我在这里看到的大小为6),则可以将name_file [-11,-5]用作从名为name_file的字符串中提取ID,如果没有,则可以进行正则表达式(查找I和.nii之间的数字)。让我们将该函数称为id_from_file_name。

-现在让我们将df_id称为通过加载csv文件获得的数据帧。做

import os
df_calc = df_id.set_index('Image_Data_Id')

def new_name_file(old_name):
    id = id_from_file_name(old_name)
    # Edit : Related to first comment, changed id to int(id)
    if int(id) not in df_calc.index:
        print( id, 'not in dataframe')
        return None
    if 'accelerated' in df_calc.loc[id, 'Description'].lower():
        type = 'Accelerated'
    else:
        type = 'Normal'
    return(f'{df_calc.loc[id,'Group']}_{df_calc.loc[id,'Subject']}_{df_calc.loc[id,'Visit']}_{type}.nii')

list_name = os.listdir(path)
for i in list_name:
    new_name = new_name_file(i)
    if new_name is not None:
        os.rename(path/old_name, path/dict_name(old_name))

编辑:要创建该函数id_from_file_name,可以执行以下操作:

import re
def id_from_file_name(name):
    return(re.search(r'I(.*?).nii', name).group(1))