python - 如何将 DICOM 文件的标头数据存储在 pandas 数据框中?
问题描述
我正在尝试在 Python 中使用 pydicom 读取 DICOM 文件,并希望将标头数据存储到 pandas 数据框中。如何为此目的提取数据元素值?
到目前为止,我已经创建了一个数据框,其中列作为 DICOM 文件中的标签名称。我已经访问了数据元素,但我只需要存储数据元素的值而不是整个序列。为此,我将序列转换为字符串并尝试拆分它。但它也不起作用,因为不同标签的长度不同。
refDs = dicom.dcmread('000000.dcm')
info_header = refDs.dir()
df = pd.DataFrame(columns = info_header)
print(df)
info_data = []
for i in info_header:
if (i in refDs):
info_data.append(str(refDs.data_element(i)).split(" ")[0])
print (info_data[0],len(info_data))
我已将数据元素序列元素放入列表中,因为我无法将其直接放入数据框中。上面代码的输出是
(0008, 0050) Accession Number SH: '1091888302507299' 89
但我只想将数据存储在引号内。
解决方案
这对我有用:
import pydicom as dicom
import pandas as pd
ds = dicom.read_file('path_to_file')
df = pd.DataFrame(ds.values())
df[0] = df[0].apply(lambda x: dicom.dataelem.DataElement_from_raw(x) if isinstance(x, dicom.dataelem.RawDataElement) else x)
df['name'] = df[0].apply(lambda x: x.name)
df['value'] = df[0].apply(lambda x: x.value)
df = df[['name', 'value']]
最终,您可以转置它:
df = df.set_index('name').T.reset_index(drop=True)
如果您还需要嵌套字段,则需要更多的工作。
推荐阅读
- c# - 调度程序不更新 ListBox 控件
- python - Python Pandas - 处理具有嵌套字典(json)值的列
- python - 检查时间控制并在 listrCtrl 中更改颜色
- django - 部署到亚马逊弹性豆茎后如何运行 collectstatic 脚本?
- message-queue - 消息总线 vs. 服务总线 vs. 事件中心 vs. 事件网格
- python - 在“从模块名导入变量”的情况下,可变性会改变命名空间的行为吗?
- leaflet - 将 choropleth 图层添加到 Leaflet 地图
- c# - 迭代 JArray 和 JArray.Children() 之间的区别
- html - 为什么这个 div 不使用 css 移动?
- r - 如何在闪亮的 navbarPage 中的单个 tabPanel 内创建侧边栏导航菜单?