{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"markdown","source":"### Directory of DICOM Files to Pandas Dataframe \nThe below code will scan a folder for .dicom files and return you a Pandas Dataframe populated with the DICOM data."},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true,"_kg_hide-input":true,"_kg_hide-output":true},"cell_type":"code","source":"import os\nimport collections\nimport ntpath\nimport pydicom\nimport pandas as pd\nfrom tqdm.notebook import tqdm\n\n\"\"\"\npandas_df_from_dicoms_folder:\nparams:\n    folder: directory with dicom files\nreturns:\n    pandas dataframe of the dicom files' data with filename as index\n\ndataset_to_dic and data_element_to_dic from:\nhttps://github.com/pydicom/contrib-pydicom/blob/master/plotting-visualization/dcm_qt_tree.py\n\"\"\"\n\ndef data_element_to_dic(data_element):\n    dic = collections.OrderedDict()\n    if data_element.VR == \"SQ\":\n        items = collections.OrderedDict()\n        dic[data_element.name] = items\n        i = 0\n        for dataset_item in data_element:\n            items['item ' + str(i)] = dataset_to_dic(dataset_item)\n            i += 1\n    elif data_element.name != 'Pixel Data':\n        dic[data_element.name] = data_element.value\n    return dic\n\n\ndef dataset_to_dic(dataset, index=None):\n    dic = {}\n    for data_element in dataset.file_meta:\n        dic.update(data_element_to_dic(data_element))\n    for data_element in dataset:\n        dic.update(data_element_to_dic(data_element))\n    if index is not None:\n        dic.update({'index': index})\n    return dic\n\n\ndef pandas_df_from_dicoms_folder(folder):\n    dcm_files = [os.path.join(folder, f.name) for f in os.scandir(folder)]\n    dcm_files = [x for x in dcm_files if x.endswith(('.dcm', '.dicom'))]\n    \n    pd_series_list = []\n    for f in tqdm(dcm_files):\n        dcm = pydicom.dcmread(f, stop_before_pixels=True)\n        dic = dataset_to_dic(dcm, index=ntpath.basename(f))\n        df = pd.Series(dic)\n        pd_series_list.append(df)\n\n    print('Done reading dicom data. Converting to dataframe...', end='')\n    df = pd.concat([pd.DataFrame(x).T for x in pd_series_list])\n    print('done.')\n    df.index = df['index']\n    df.index.name = None\n    df = df.drop(columns=['index'])\n    return df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"### Usage ###\ndicom_folder = '/kaggle/input/vinbigdata-chest-xray-abnormalities-detection/train/'\ndf = pandas_df_from_dicoms_folder(dicom_folder)\ndf.index = df.index.str.replace('.dicom$', '', regex=True)\ndf","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}