Python从嵌套字典JSON响应中高效提取数据生成DataFrame
高效提取JSON响应中'values'数据生成DataFrame的方案
问题场景
通过grequests批量获取JSON响应,核心代码如下:
def GetData(): urlRespDict = {} for OrderNo in LookupNumbers['id']: urls1 = [] for idno in ParameterList: urlTemp = url0_const + OrderNo + url1_const + idno + param1_const urls1.append(urlTemp) urlRespDict[OrderNo] = grequests.map((grequests.get(u) for u in urls1)) return urlRespDict
- 代码返回一个包含4个键的字典,每个键对应长度为136的响应列表
- 单个响应解析后(如
d1 = dict_responses['180378'][0].json())是嵌套字典的列表,目标是提取其中values字段的数据:将values的键作为DataFrame列,对应值作为行数据
现有方案的问题
此前尝试用apply(pd.Series)处理,代码如下,但因逐行处理开销大,耗时极长:
df2 = [(pd.DataFrame.from_records(n))['values'].apply(pd.Series,dtype="string") for n in df1]
高效替代方案
1. 批量提取所有values数据
先遍历所有响应,把需要的values字典统一收集到列表中:
# 初始化列表存储所有values字典 all_values = [] # 遍历字典中的每个订单号和对应的响应列表 for order_no, responses in dict_responses.items(): for resp in responses: # 解析响应为JSON格式 json_data = resp.json() # 遍历JSON数据中的每个元素,提取values字段 for item in json_data: all_values.append(item['values'])
2. 直接构造完整DataFrame
利用Pandas的矢量化构造方法,一次性生成目标DataFrame,速度远快于逐行处理:
import pandas as pd # 直接用字典列表构造DataFrame,指定数据类型 result_df = pd.DataFrame(all_values, dtype="string")
进阶:保留订单号关联(可选)
如果需要将values数据和对应的订单号关联,可以修改提取逻辑,把订单号并入每行数据:
all_data = [] for order_no, responses in dict_responses.items(): for resp in responses: json_data = resp.json() for item in json_data: # 合并订单号和values字典 row_data = {'OrderNo': order_no, **item['values']} all_data.append(row_data) # 构造包含订单号的DataFrame result_df = pd.DataFrame(all_data, dtype="string")
性能优势说明
pd.DataFrame()直接基于字典列表构造属于矢量化操作,内部批量处理数据,避免了apply(pd.Series)逐行循环的高开销- 减少了多次创建小型DataFrame再合并的额外消耗,一次性完成完整数据结构的构建
内容的提问来源于stack exchange,提问作者Mechanico
相关产品推荐
相关产品推荐

