使用 Pandas json_normalize 展平嵌套 JSON 数据

使用 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 jsonimport pandas as pdwith 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 这三个嵌套列表分别进行展平:

Find JSON Path Online Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30 查看详情 Find JSON Path Online

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 jsonimport pandas as pdwith 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 数据的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/592453.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月10日 16:32:52
下一篇 2025年11月10日 16:33:47

相关推荐

  • 深入理解Go语言通道:缓冲与阻塞机制

    本文深入探讨go语言中缓冲与无缓冲通道的关键差异及其阻塞行为。无缓冲通道要求发送与接收严格同步,任何一方未准备好都会导致阻塞甚至死锁。而缓冲通道则允许在缓冲区有容量时非阻塞地发送数据,从而在一定程度上解耦发送方与接收方,但若缓冲区满载,发送操作仍将导致阻塞。 Go语言通道概述 Go语言的并发模型基于…

    2025年12月16日
    000
  • Google Cloud Datastore 投影查询与索引管理指南

    本文旨在解决google cloud datastore中gql投影查询多属性失败的问题,特别是当尝试选择多个非主键属性时遇到的索引缺失错误,以及尝试投影`__key__`时出现的限制。文章将详细阐述投影查询的工作原理、索引在其中的关键作用,并提供创建复合索引的`index.yaml`配置示例,同时…

    2025年12月16日
    000
  • Go模板:利用FuncMap实现字符串大小写转换及自定义函数扩展

    本文将指导如何在go语言的html/text模板中正确地进行字符串大写转换。由于模板无法直接调用`strings.toupper`等包级函数,我们将详细介绍如何利用`text/template`包提供的`funcmap`机制,注册并注入自定义函数,从而在模板中通过管道(pipe)操作符优雅地实现字符…

    2025年12月16日
    000
  • Go语言中缓冲与非缓冲通道的阻塞行为深度解析

    本文深入探讨go语言中缓冲与非缓冲通道在发送操作时的阻塞机制。我们将阐明为何非缓冲通道在没有接收者时会立即引发死锁,而缓冲通道在容量未满时允许发送操作顺利完成。通过代码示例,文章将详细解释缓冲区的存在如何影响通道的阻塞行为,并展示在何种情况下缓冲通道同样会导致死锁。 Go语言通道简介 Go语言通过g…

    2025年12月16日
    000
  • Golang如何在函数返回中使用指针_Golang 函数返回指针实践

    使用指针返回可避免大结构体拷贝、提升性能,并支持修改原始数据。通过逃逸分析,Go能安全返回局部变量地址;基本类型指针需谨慎使用,常用于标记“空值”;当接口方法为指针接收者时,必须返回指针以满足接口实现。 在Go语言中,函数返回指针是一种常见且高效的编程实践。它能避免大型结构体的值拷贝,提升性能,同时…

    2025年12月16日
    000
  • 解决macOS上Go安装时ld链接器写文件失败错误指南

    本文详细介绍了在macos系统上安装go语言时遇到的`ld: can’t write output file`链接器错误。该错误通常由文件权限问题引起,即使在用户主目录下也可能发生。文章提供了通过递归重置go安装目录权限来解决此问题的具体步骤和命令,确保go能够顺利编译和安装,并探讨了相…

    2025年12月16日
    000
  • 解决Google Datastore GQL投影查询限制的教程

    本教程旨在解决google datastore gql投影查询中遇到的常见问题,特别是关于多属性查询失败及`__key__`无法投影的错误。文章将详细阐述投影查询的限制,强调仅索引属性可被投影,并指导如何通过`index.yaml`创建复合索引。同时,还将解释`__key__`的正确获取方式,确保用…

    2025年12月16日
    000
  • 如何在Golang中实现并发安全队列_Golang 并发安全队列实践

    答案:Go中实现并发安全队列可使用channel或Mutex+切片。channel天然并发安全,适合简单场景;自定义队列通过sync.Mutex保护切片操作,支持泛型、动态扩容与复杂控制,适用于需非阻塞操作或批量处理的场景。高并发下可考虑无锁优化,但应避免过早优化。实际选择需权衡需求与复杂度。 在G…

    2025年12月16日
    000
  • 如何用Golang实现函数调用错误检查_Golang 函数调用错误检查实践

    Go语言通过返回error类型显式处理错误,要求调用后立即检查。例如os.Open、http.Get等函数需先判断err是否为nil,避免使用无效资源。常见疏漏包括忽略错误、延迟检查或假设执行成功,尤其在文件操作、网络请求和JSON编解码中更需注意。复杂流程可复用err变量逐层检查,结合defer释…

    2025年12月16日
    000
  • Go语言中mgo与big.Rat高精度有理数的持久化存储实践

    本教程详细阐述了如何在go语言应用中,利用`mgo`驱动将`math/big.rat`类型的高精度有理数存储到mongodb。针对`big.rat`无法直接持久化的挑战,文章提出了一种解决方案:通过自定义结构体分别存储其分子和分母(使用`int64`类型),实现数据的精确保存与恢复,确保金融或科学计…

    2025年12月16日
    000
  • Go语言内存波动现象解析与诊断实践

    go程序在稳定运行状态下,即使没有新的对象分配,仍可能出现显著的内存波动。这主要是因为go运行时管理着自己的内存堆,并不会立即将垃圾回收器释放的内存归还给操作系统,而是将其保留以备后续复用。这种行为旨在优化性能,减少系统调用开销。准确诊断内存波动需借助`runtime.memstats`,而非单纯依…

    2025年12月16日
    000
  • Golang如何实现微服务熔断与限流_Golang 微服务熔断限流方法

    Golang中通过Hystrix和gobreaker实现熔断,防止服务雪崩;利用rate包基于令牌桶算法实现限流,控制请求速率;结合Web框架中间件统一管理流量,提升系统稳定性与可用性。 微服务架构中,服务之间的依赖关系复杂,一旦某个下游服务出现延迟或故障,很容易引发雪崩效应。Golang 作为高性…

    2025年12月16日
    000
  • 如何使用Golang实现微服务健康检查_Golang 服务健康监控实践

    健康检查机制对微服务稳定性至关重要,Golang可实现基础HTTP接口返回服务状态,通过/healthz路径提供JSON格式响应;生产环境需扩展检查数据库、缓存等依赖项,结合DetailedHealth结构体返回详细状态,并根据检测结果设置HTTP状态码;为支持监控,可集成Prometheus,使用…

    2025年12月16日
    000
  • 如何在Golang中实现责任链模式分发请求

    责任链模式通过接口定义处理器行为,用组合串联多个处理器,请求沿链传递直至被处理。 在Golang中实现责任链模式,核心是让多个处理器依次处理请求,直到某个处理器能够处理为止。每个处理器持有下一个处理器的引用,形成一条“链”。当一个请求到来时,它被传递给链上的第一个处理器,如果当前处理器无法处理,就转…

    2025年12月16日
    000
  • Go语言中实现动态多维与异构切片:利用interface{}的技巧

    本文探讨了在go语言中如何实现动态多维切片以存储异构数据。通过利用空接口`interface{}`,开发者可以构建出在编译时未知元素类型和维度的切片结构,从而灵活地处理复杂数据场景。文章将通过具体示例代码,演示如何声明、添加和访问这类动态切片中的数据,并提供两种实现策略的比较。 Go语言以其静态类型…

    2025年12月16日
    000
  • Go语言中高效判断两个time.Time对象是否属于同一日历日

    本文旨在探讨在go语言中,如何高效地比较两个`time.time`对象是否落在同一个日历日。我们将分析常见的比较方法及其潜在的效率问题,并重点介绍使用`time.time.date()`方法实现日期相等性判断的最佳实践,该方法通过一次调用获取年、月、日,显著提升了性能,是处理此类场景的推荐方案。 在…

    2025年12月16日
    000
  • Go语言中目录及其子目录的递归删除与创建:实用指南

    本文旨在提供go语言中安全、高效地删除和创建目录(包括其所有子目录和文件)的教程。我们将重点介绍go标准库`os`包中的`os.removeall`和`os.mkdirall`函数,并对比分析通过`exec.command`调用外部系统命令的常见陷阱与正确用法,强调go原生解决方案的跨平台优势和健壮…

    2025年12月16日
    000
  • 如何在Golang中开发投票统计功能_Golang 投票统计系统实践

    答案:在Golang中实现投票统计需定义Vote和VotingPool结构体,使用sync.RWMutex保证并发安全,通过CastVote方法处理投票逻辑,GetResults提供查询接口,并结合HTTP服务暴露RESTful路由,最终通过锁优化、持久化与Redis集成提升性能与可靠性。 在Gol…

    2025年12月16日
    000
  • Go语言中多变量的声明与初始化方法详解

    本文深入探讨了go语言中同时声明和初始化多个变量的多种实用方法。我们将详细介绍如何使用`var`关键字进行显式类型声明,以及如何利用短变量声明`:=`实现便捷的类型推断和赋值。通过具体的代码示例和实践指导,本文旨在帮助读者高效、清晰地管理go程序中的变量声明。 1. Go语言中多变量声明的基础 Go…

    2025年12月16日
    000
  • Golang如何定义指针变量与初始化_Golang 指针变量初始化实践

    Go中指针存储变量地址,通过定义指针类型,&获取变量地址,new(T)分配并返回T类型零值的指针,示例展示指针的声明、赋值及通过操作目标变量,强调安全性与简洁性。 在 Go 语言中,指针是一个存储变量内存地址的变量。理解如何定义和初始化指针是掌握 Go 内存模型和高效编程的关键一步。 定义指…

    2025年12月16日
    000

发表回复

登录后才能评论
关注微信