如何用Python拆分JSON文件中的元数据与多组测量数据
解决JSON元数据与测量数据拆分问题
先修正你代码里的明显错误
你第二段代码的问题是变量名搞混了:把加载的JSON数据赋值给了measurements变量,但后面却去访问data['measurements'],这肯定会报KeyError。就算变量名改对,如果你的JSON里measurements不是顶级键,而是嵌套在data数组的每个条目里,直接取顶级键还是会错。
基于常见JSON结构的解决方案
假设你的JSON结构大概是这样(如果实际结构不同,你可以补充示例):
{ "data": [ { "sample_id": "S001", "test_time": "2024-05-20", "measurements": [{"datax": 1.2, "datay": 3.4}, {"datax": 2.3, "datay":4.5}] }, { "sample_id": "S002", "test_time": "2024-05-21", "measurements": [{"datax":5.6, "datay":6.7}, {"datax":7.8, "datay":8.9}] } ] }
1. 提取元数据列表
你已经实现了这部分,这里再给个通用写法:
import json import pandas as pd with open('Filename.json') as f: raw_data = json.load(f) # 提取元数据(假设元数据是每个data条目中除measurements外的字段) metadata_list = [] for item in raw_data['data']: # 复制当前条目的所有键值对,排除measurements字段 meta = {k: v for k, v in item.items() if k != 'measurements'} metadata_list.append(meta) # 转成DataFrame查看 meta_df = pd.DataFrame(metadata_list) display(meta_df)
2. 按组提取所有datax、datay
如果要把每组的测量数据单独整理成列表:
measurements_groups = [] for item in raw_data['data']: # 提取当前组的所有datax和datay group_datax = [m['datax'] for m in item['measurements']] group_datay = [m['datay'] for m in item['measurements']] measurements_groups.append({ "sample_id": item['sample_id'], # 关联元数据标识 "datax_list": group_datax, "datay_list": group_datay }) # 转成DataFrame查看 groups_df = pd.DataFrame(measurements_groups) display(groups_df)
3. 展开测量数据为扁平结构(更适合数据分析)
如果需要把每个测量点单独成行,同时保留对应的元数据:
flat_measurements = [] for item in raw_data['data']: meta = {k: v for k, v in item.items() if k != 'measurements'} # 遍历当前组的每个测量点,合并元数据和测量数据 for m in item['measurements']: flat_row = {**meta, **m} flat_measurements.append(flat_row) # 转成DataFrame查看 flat_df = pd.DataFrame(flat_measurements) display(flat_df)
为什么你之前的代码只显示首个测量条目
你第一段代码pd.DataFrame(data['data'])会把data数组里的每个条目转成一行,但measurements是数组类型,pandas默认只会显示数组的第一个元素(或者以数组形式存储,但看起来像是只显示首个条目),所以需要手动遍历拆分嵌套的数组。
内容的提问来源于stack exchange,提问作者wallydog
相关产品推荐
相关产品推荐

