如何用Python的Pandas提取嵌套JSON文件中的score字段?
解决方案
1. 单个JSON文件的score提取
你的JSON存在多层嵌套,且response_sets下的键是随机ID,需要先处理这一结构,才能用Pandas正确提取数据。这里需要提取两类score:
audit_data.score:整体评分response_sets下每个问题选项的responses.score
方法一:手动遍历提取
import pandas as pd import json # 读取JSON文件 with open("your_file.json", "r") as f: raw_data = json.load(f) # 提取整体评分 audit_score = raw_data["audit_data"]["score"] # 提取所有选项的评分 response_details = [] for question_id, question_content in raw_data["template_data"]["response_sets"].items(): for resp in question_content["responses"]: response_details.append({ "question_id": question_id, "response_label": resp["label"], "response_score": resp["score"] }) # 转换为DataFrame audit_df = pd.DataFrame({"audit_score": [audit_score]}) response_df = pd.DataFrame(response_details) # 合并两类数据(按需选择) final_single_df = pd.concat([audit_df]*len(response_df), ignore_index=True).join(response_df)
方法二:使用pd.json_normalize
先将response_sets的字典转为列表,再用normalize展开嵌套:
import pandas as pd import json with open("your_file.json", "r") as f: raw_data = json.load(f) # 预处理:把response_sets的字典转成列表 processed_data = raw_data.copy() processed_data["template_data"]["response_sets"] = list(processed_data["template_data"]["response_sets"].values()) # 用normalize提取数据 df = pd.json_normalize( processed_data, # 指定要展开的嵌套列表路径 record_path=["template_data", "response_sets", "responses"], # 指定要保留的顶层/其他层级元数据 meta=[ "template_id", "audit_id", ["audit_data", "score"] ] ) # 重命名列名更直观 df.rename(columns={"audit_data.score": "audit_score", "score": "response_score"}, inplace=True)
2. 批量处理多个JSON文件
遍历指定文件夹下所有.json文件,重复提取逻辑并合并数据:
import os import pandas as pd import json folder_path = "存放JSON的文件夹路径" all_records = [] for filename in os.listdir(folder_path): if filename.endswith(".json"): file_path = os.path.join(folder_path, filename) with open(file_path, "r") as f: raw_data = json.load(f) # 提取基础信息和整体评分 base_info = { "file_name": filename, "template_id": raw_data["template_id"], "audit_id": raw_data["audit_id"], "audit_score": raw_data["audit_data"]["score"] } # 提取每个选项的评分并关联基础信息 for question_id, question_content in raw_data["template_data"]["response_sets"].items(): for resp in question_content["responses"]: record = base_info.copy() record.update({ "question_id": question_id, "response_label": resp["label"], "response_score": resp["score"] }) all_records.append(record) # 生成最终合并后的DataFrame final_batch_df = pd.DataFrame(all_records) print(final_batch_df.head())
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

