这里是数据科学的障碍...我需要根据具有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
也许以图像格式更容易理解:
文件名在列表中列出,通过以下方式完成:
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
的单词是否已加速)
关于如何处理此问题的任何建议?
答案 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))