使用 Pandas json_normalize 展平嵌套 JSON 数据

碧海醫心
发布: 2025-10-16 11:04:10
原创
925人浏览过

使用 pandas json_normalize 展平嵌套 json 数据

本文旨在指导读者如何使用 Pandas 库中的 `json_normalize` 函数处理包含嵌套列表的 JSON 文件,将其转换为易于分析的表格数据。我们将详细介绍如何针对不同的嵌套层级进行展平操作,并演示如何将展平后的数据合并成一个完整的 DataFrame。通过本文的学习,读者将能够有效地处理复杂的 JSON 数据,并将其应用于实际的数据分析任务中。

准备工作

首先,确保你已经安装了 Pandas 库。如果没有安装,可以使用 pip 进行安装:

pip install pandas
登录后复制

加载 JSON 数据

假设我们有一个名为 data.json 的 JSON 文件,内容如下:

[{
  "uuid": "a2d89c9b-6e2e-4e3a-8d60-bf3ce2fe3fda",
  "timestamp": "2023-11-23 00:26:31.851000 UTC",
  "process_timestamp": "2023-11-23 00:26:32.326000 UTC",
  "visitor_id": "oeu1700282566730r0.9025758502018271",
  "session_id": "AUTO",
  "account_id": "25408250069",
  "experiments": {
    "list": [{
      "element": {
        "campaign_id": "26314710187",
        "experiment_id": "26322360336",
        "variation_id": "26314800349",
        "is_holdback": "false"
      }
    }]
  },
  "entity_id": "25754820685",
  "attributes": {
    "list": [{
      "element": {
        "id": null,
        "name": "",
        "type": "browserId",
        "value": "gc"
      }
    }, {
      "element": {
        "id": null,
        "name": "",
        "type": "campaign",
        "value": "blablabla"
      }
    }, {
      "element": {
        "id": null,
        "name": "",
        "type": "device",
        "value": "desktop"
      }
    }, {
      "element": {
        "id": null,
        "name": "",
        "type": "device_type",
        "value": "desktop_laptop"
      }
    }, {
      "element": {
        "id": null,
        "name": "",
        "type": "referrer",
        "value": "https://bookings.perrito.com/21df6542"
      }
    }, {
      "element": {
        "id": null,
        "name": "",
        "type": "source_type",
        "value": "campaign"
      }
    }, {
      "element": {
        "id": null,
        "name": "",
        "type": "currentTimestamp",
        "value": "1700699073915"
      }
    }, {
      "element": {
        "id": null,
        "name": "",
        "type": "offset",
        "value": "300"
      }
    }]
  },
  "user_ip": "72.38.10.0",
  "user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
  "referer": "https://bookings.perrito.com/",
  "event_type": "other",
  "event_name": "transaction",
  "revenue": "240939",
  "value": null,
  "quantity": null,
  "tags": {
    "key_value": [{
      "key": "tour_id",
      "value": "386"
    }, {
      "key": "booking_id",
      "value": "123456"
    }, {
      "key": "payment_type",
      "value": "creditcard"
    }, {
      "key": "revenue",
      "value": "240939"
    }, {
      "key": "pax",
      "value": "1"
    }, {
      "key": "tour_name",
      "value": "Best Viaje ever"
    }, {
      "key": "extras",
      "value": "245.00"
    }]
  },
  "revision": "859",
  "client_engine": "js",
  "client_version": "0.188.1",
  "element": {
    "campaign_id": "26314710187",
    "experiment_id": "26322360336",
    "variation_id": "26314800349",
    "is_holdback": "false"
  }
}]
登录后复制

使用以下代码加载 JSON 数据:

import json
import pandas as pd

with open("data.json", "r") as f:
    data = json.load(f)
登录后复制

使用 json_normalize 展平数据

json_normalize 函数可以将 JSON 数据展平为表格形式。对于包含嵌套列表的 JSON,我们需要指定 record_path 参数来告诉函数需要展平的列表路径。

首先,定义一些顶层字段作为元数据,这些字段将作为索引字段保留在展平后的数据中:

meta = [
    "uuid",
    "timestamp",
    "process_timestamp",
    "visitor_id",
    "session_id",
    "account_id",
    "entity_id",
    "user_ip",
    "user_agent",
    "referer",
    "event_type",
    "event_name",
    "revenue",
    "value",
    "quantity",
    "revision",
    "client_engine",
    "client_version",
]
登录后复制

接下来,针对 experiments.list、attributes.list 和 tags.key_value 这三个嵌套列表分别进行展平:

AssemblyAI
AssemblyAI

转录和理解语音的AI模型

AssemblyAI 65
查看详情 AssemblyAI
experiments_list = pd.json_normalize(
    data=data,
    record_path=["experiments", "list"],
    meta=meta,
    record_prefix="experiments.list.",
)

attributes_list = pd.json_normalize(
    data=data,
    record_path=["attributes", "list"],
    meta=meta,
    record_prefix="attributes.list.",
)

tags_key_value = pd.json_normalize(
    data=data,
    record_path=["tags", "key_value"],
    meta=meta,
    record_prefix="tags.key_value.",
)
登录后复制

在上述代码中,record_path 参数指定了需要展平的列表路径,meta 参数指定了需要保留的元数据字段,record_prefix 参数用于为展平后的字段添加前缀,避免命名冲突。

合并展平后的数据

展平后的数据分别存储在 experiments_list、attributes_list 和 tags_key_value 三个 DataFrame 中。为了将这些数据合并成一个完整的 DataFrame,可以使用 pd.merge 函数:

out = (
    pd.merge(left=experiments_list, right=attributes_list, on=meta)
    .merge(right=tags_key_value, on=meta)
)
登录后复制

pd.merge 函数根据指定的元数据字段将 DataFrame 进行合并。注意,由于每个嵌套列表的长度可能不同,合并后的 DataFrame 可能会出现重复的行。

示例代码

以下是完整的示例代码:

import json
import pandas as pd

with open("data.json", "r") as f:
    data = json.load(f)

meta = [
    "uuid",
    "timestamp",
    "process_timestamp",
    "visitor_id",
    "session_id",
    "account_id",
    "entity_id",
    "user_ip",
    "user_agent",
    "referer",
    "event_type",
    "event_name",
    "revenue",
    "value",
    "quantity",
    "revision",
    "client_engine",
    "client_version",
]

experiments_list = pd.json_normalize(
    data=data,
    record_path=["experiments", "list"],
    meta=meta,
    record_prefix="experiments.list.",
)

attributes_list = pd.json_normalize(
    data=data,
    record_path=["attributes", "list"],
    meta=meta,
    record_prefix="attributes.list.",
)

tags_key_value = pd.json_normalize(
    data=data,
    record_path=["tags", "key_value"],
    meta=meta,
    record_prefix="tags.key_value.",
)

out = (
    pd.merge(left=experiments_list, right=attributes_list, on=meta)
    .merge(right=tags_key_value, on=meta)
)

print(out)
登录后复制

注意事项

  • 在使用 json_normalize 函数时,需要仔细分析 JSON 数据的结构,确定正确的 record_path 和 meta 参数。
  • 如果 JSON 数据中包含多个嵌套层级,可能需要多次调用 json_normalize 函数进行展平。
  • 合并展平后的数据时,需要注意数据重复的问题,可以根据实际需求进行去重或聚合操作。

总结

本文介绍了如何使用 Pandas 库中的 json_normalize 函数处理包含嵌套列表的 JSON 文件。通过指定 record_path 和 meta 参数,我们可以将 JSON 数据展平为表格形式,并使用 pd.merge 函数将展平后的数据合并成一个完整的 DataFrame。掌握这些技巧可以帮助我们更有效地处理复杂的 JSON 数据,并将其应用于实际的数据分析任务中。

以上就是使用 Pandas json_normalize 展平嵌套 JSON 数据的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号