如何从API返回的嵌套JSON列表中提取所有serie数据并转为DataFrame?
如何从嵌套JSON中提取所有
serie数据到Pandas DataFrame(不依赖位置索引) 我从API获取了如下格式的JSON响应:
[ { "id": "1", "variable": "x", "unt": "%", "results": [ { "classification": [ { "id": "1", "name": "group", "category": { "555": "general" } } ], "series": [ { "location": { "id": "1", "level": { "id": "n1", "name": "z" }, "name": "z" }, "serie": { "202001": "0.08", "202002": "0.48", "202003": "0.19" } } ] } ] } ]
我现在可以通过索引[0]提取首个serie的数据并转为DataFrame,但当存在多条记录时,这种方法无法获取全部数据:
content = val[0]["results"][0]["series"][0]["serie"] df = pd.DataFrame(content.items()) df 0 1 0 202001 0.08 1 202002 0.48 2 202003 0.19
请问有没有不依赖位置索引来获取所有相关serie数据的方法?
没问题,要处理这种嵌套的JSON结构,我们可以通过遍历所有层级的列表来收集所有serie数据,而不是硬编码索引[0]。这里有几种实用的方法:
方法1:嵌套循环收集所有serie数据
用多层循环逐个遍历每个层级的列表,把所有serie的键值对收集到一个统一的列表中,最后转为DataFrame:
import pandas as pd # 假设val是你从API获取的JSON数据 all_series = [] # 遍历最外层的顶级条目 for item in val: # 遍历当前条目下的所有results for result in item["results"]: # 遍历当前result下的所有series条目 for series_entry in result["series"]: # 提取当前serie的日期和数值,存入列表 for date, value in series_entry["serie"].items(): all_series.append({"date": date, "value": value}) # 转换为DataFrame df = pd.DataFrame(all_series)
这种写法逻辑清晰,不管每个层级有多少条数据,都会被全部收集到,完全不依赖固定索引。
方法2:用列表推导式简化代码
如果喜欢更紧凑的写法,可以用多层列表推导式替代循环,效果和方法1完全一致:
import pandas as pd all_series = [ {"date": date, "value": value} for item in val for result in item["results"] for series_entry in result["series"] for date, value in series_entry["serie"].items() ] df = pd.DataFrame(all_series)
方法3:保留额外上下文信息(可选)
如果需要把variable、location等关联信息也保留到DataFrame里,方便后续多维度分析,可以稍微调整代码:
import pandas as pd all_series = [] for item in val: # 提取当前条目的变量信息 variable = item["variable"] for result in item["results"]: for series_entry in result["series"]: # 提取位置相关信息 location_name = series_entry["location"]["name"] location_level = series_entry["location"]["level"]["name"] # 把上下文信息和serie数据一起存入 for date, value in series_entry["serie"].items(): all_series.append({ "variable": variable, "location": location_name, "location_level": location_level, "date": date, "value": value }) df = pd.DataFrame(all_series)
这样得到的DataFrame会包含更丰富的维度信息,实用性更强。
内容的提问来源于stack exchange,提问作者Luiz
相关产品推荐
相关产品推荐

