处理LIDC-IDLI数据集时pandas读csv报KeyError: 'Modality'的原因及解决
错误产生原因
- 你调用
pd.read_csv()时指定了header=None参数,该参数会强制pandas将csv文件的第一行当作普通数据行处理,而非列名行。即便你传入了names=column_names指定列名,只要column_names列表内未包含Modality,或者你定义的column_names和csv实际的列数量、顺序不匹配,都会导致最终生成的DataFrame不存在名为Modality的列,访问时就会抛出KeyError。 - 另一种可能是你本地的csv元数据文件本身没有
Modality字段,或者字段名存在拼写误差,比如大小写不一致、前后附带空格,例如实际列名为modality或者Modality。
解决方法
第一步:先排查DataFrame的实际列名
读取文件后先打印列名确认问题,运行如下代码:
meta = pd.read_csv(metadatapath, header=None, delimiter=",", names=column_names) print(meta.columns.tolist())
如果输出的列表里没有Modality,先检查column_names的定义是否正确,是否和csv文件的列一一对应。
第二步:修正csv读取参数
如果你的csv文件本身第一行就是列名,直接去掉header=None参数即可,pandas会自动把第一行识别为列名,不需要额外传入names参数:
# csv第一行是自带列名的场景 meta = pd.read_csv(metadatapath, delimiter=",")
如果确实需要自定义列名,确保column_names列表的长度和csv的列数完全一致、顺序对应,且包含Modality字段:
# 确认column_names定义正确,示例如下,按实际列补全即可 column_names = ["SeriesInstanceUID", "Modality", "PatientID", ...] meta = pd.read_csv(metadatapath, header=None, delimiter=",", names=column_names)
第三步:校验字段拼写
如果列名存在大小写差异、多余空格的情况,统一修正后再操作:
# 去除列名前后空格 meta.columns = meta.columns.str.strip() # 或者直接重命名对应列 meta = meta.rename(columns={"modality": "Modality"})
修正后的完整参考代码
import pandas as pd # csv第一行自带包含Modality的列名的场景 meta = pd.read_csv(metadatapath, delimiter=",") meta = meta.drop(meta[meta['Modality']!='CT'].index) meta = meta.reset_index(drop=True) # 加drop=True可避免生成多余的index列
内容的提问来源于stack exchange,提问作者kkk123
相关产品推荐
相关产品推荐

