You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 04:55:40