如何将IPTC媒体主题JSON转换为字段化Pandas DataFrame
解决IPTC媒体主题数据转结构化Pandas DataFrame的问题
问题背景
需要将IPTC媒体主题数据转换为结构化Pandas DataFrame,核心需求是提取Q-code(如medtop:01000000)及对应的Name(en-GB)(如arts, culture, entertainment and media)。当前通过pd.read_json()加载处理后的JSON文件时,仅得到包含索引和嵌套长字符串的两列,数据以嵌套字典形式存储。
解决方案
步骤1:正确读取并解析JSON数据
直接用pd.read_json()会将整个JSON结构作为单行列加载,需要先手动解析JSON,提取核心的conceptSet数据:
import pandas as pd import json # 加载JSON文件 with open("cptall-en-GB.json", "r", encoding="utf-8") as f: raw_data = json.load(f) # 提取conceptSet中的所有概念条目 concept_data = raw_data["conceptSet"] # 将字典转换为DataFrame,orient="index"表示用字典的键作为行索引 df = pd.DataFrame.from_dict(concept_data, orient="index")
步骤2:提取嵌套字段
prefLabel是嵌套字典,需要从中提取en-GB对应的名称;qcode字段可直接使用:
# 提取en-GB语言的主题名称 df["Name(en-GB)"] = df["prefLabel"].apply(lambda item: item.get("en-GB")) # 筛选出核心需求的两列并重命名 final_df = df[["qcode", "Name(en-GB)"]].rename(columns={"qcode": "Q-code"})
可选:提取其他字段
如果需要额外字段(如定义、修改时间等),用同样方式提取嵌套内容:
# 提取en-GB语言的定义 df["Definition(en-GB)"] = df["definition"].apply(lambda item: item.get("en-GB")) # 提取修改时间 df["Modified"] = df["modified"]
结果示例
运行上述代码后,final_df会呈现结构化的表格:
| Q-code | Name(en-GB) | |
|---|---|---|
| 0 | medtop:01000000 | arts, culture, entertainment and media |
| 1 | medtop:02000000 | crime, law and justice |
内容的提问来源于stack exchange,提问作者user19495470
相关产品推荐
相关产品推荐

