如何在Pandas json_normalize中仅选择指定字典字段?
Pandas json_normalize 仅提取指定字段的优化方法
需求说明
需要从给定JSON数据中提取cik、entityName、end、fp、val字段,生成指定结构的DataFrame,避免包含冗余字段。
原始JSON数据
{ "cik": 320193, "entityName": "Apple Inc.", "facts": { "dei": { "EntityCommonStockSharesOutstanding": { "label": "Entity Common Stock, Shares Outstanding", "units": { "shares": [ { "end": "2023-07-21", "val": 15634232000, "accn": "0000320193-23-000077", "fy": 2023, "fp": "Q3", "form": "10-Q", "filed": "2023-08-04", "frame": "CY2023Q2I" }, { "end": "2023-10-20", "val": 15552752000, "accn": "0000320193-23-000106", "fy": 2023, "fp": "FY", "form": "10-K", "filed": "2023-11-03", "frame": "CY2023Q3I" } ] } } } } }
期望结果
end val fy fp cik entityName 0 2023-07-21 15634232000 2023 Q3 320193 Apple Inc. 1 2023-10-20 15552752000 2023 FY 320193 Apple Inc.
当前问题
使用以下代码会将shares列表中的所有字段都规范化,产生冗余列:
df = pd.json_normalize(json_data, record_path=['facts', 'dei', 'EntityCommonStockSharesOutstanding', 'units', 'shares'], meta=['cik', 'entityName'])
得到的冗余结果:
end val accn fy fp form filed frame cik entityName 0 2023-07-21 15634232000 0000320193-23-000077 2023 Q3 10-Q 2023-08-04 CY2023Q2I 320193 Apple Inc. 1 2023-10-20 15552752000 0000320193-23-000106 2023 FY 10-K 2023-11-03 CY2023Q3I 320193 Apple Inc.
解决方案:前置筛选字段再规范化
json_normalize本身没有直接指定提取record中部分字段的参数,但可以先对目标列表的每个字典做字段筛选,只保留需要的键值对,再进行规范化操作,一步得到目标结果:
import pandas as pd # 先筛选shares列表中的指定字段 target_fields = ['end', 'val', 'fy', 'fp'] filtered_records = [ {k: item[k] for k in target_fields} for item in json_data['facts']['dei']['EntityCommonStockSharesOutstanding']['units']['shares'] ] # 用筛选后的记录生成DataFrame,并关联外层的meta字段 df = pd.json_normalize( filtered_records, meta=[['cik'], ['entityName']], record_prefix='' ) # 调整列顺序(可选,匹配期望结果的列顺序) df = df[['end', 'val', 'fy', 'fp', 'cik', 'entityName']]
执行后即可得到完全符合要求的DataFrame,无需后续删除冗余列。
内容的提问来源于stack exchange,提问作者jmq
相关产品推荐
相关产品推荐

