Pandas DataFrame 多列组合统计数据计算与分组展示

pandas dataframe 多列组合统计数据计算与分组展示

本文旨在帮助读者掌握如何使用 Pandas 库对 DataFrame 中多个列的组合进行分组,并计算每个组合的统计数据,包括中位数、平均值、计数、90% 分位数和 10% 分位数。通过 groupby() 和 agg() 函数的灵活运用,以及 MultiIndex 的构建,可以高效地完成数据分析任务,并将结果以清晰的方式呈现。

DataFrame 分组与统计聚合

在数据分析中,经常需要对数据进行分组,然后针对每个组计算统计指标。Pandas 提供了强大的 groupby() 方法来实现这一功能。结合 agg() 方法,可以轻松地计算各种统计量,例如均值、中位数、计数和分位数。

假设我们有以下 DataFrame:

import pandas as pdimport numpy as npdata = {'Var1': [True, False, True, False, True, False, True, False, True],        'Var2': [1, 2, 3, 1, 2, 3, 1, 2, 3],        'Var3': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],        'Value': [12, 93, 28, 23, 94, 12, 85, 23, 2]}df = pd.DataFrame(data)print(df)

输出:

   Var1  Var2 Var3  Value0  True     1    A     121 False     2    B     932  True     3    C     283 False     1    A     234  True     2    B     945 False     3    C     126  True     1    A     857 False     2    B     238  True     3    C      2

我们的目标是根据 Var1、Var2 和 Var3 的组合对数据进行分组,并计算每个组的 Value 列的中位数、平均值、计数、90% 分位数和 10% 分位数。

实现步骤

分组与聚合

使用 groupby() 方法对 DataFrame 进行分组,并使用 agg() 方法计算统计量。

df = df.groupby(["Var1", "Var2", "Var3"]).agg(    Med=("Value", "median"),    Mean=("Value", "mean"),    Count=("Value", "count"),    q90=("Value", lambda x: x.quantile(q=0.9)),    q10=("Value", lambda x: x.quantile(q=0.1)),)

这里,agg() 方法接受一个字典,字典的键是新列的名称,值是一个元组,元组的第一个元素是要进行统计的列名,第二个元素是统计函数。 对于分位数,我们使用 lambda 函数来调用 quantile() 方法。

重建索引 (Reindexing)

为了确保所有可能的组合都存在于结果中,即使某些组合在原始数据中没有出现,我们需要重建索引。

df = df.reindex(    pd.MultiIndex.from_product(        [[True, False], [1, 2, 3], ["A", "B", "C"]], names=["Var1", "Var2", "Var3"]    ))

pd.MultiIndex.from_product() 创建一个包含所有可能组合的多重索引。reindex() 方法使用这个多重索引来重新索引 DataFrame。 如果某个组合在原始数据中不存在,则其对应的统计量将为 NaN。

分组打印结果

最后,我们可以遍历分组后的 DataFrame,并打印每个组的结果。

for _, g in df.groupby(level=[0, 1, 2]):    print(g)    print("-" * 80)

groupby(level=[0, 1, 2]) 按照多重索引的级别进行分组。

完整代码示例

import pandas as pdimport numpy as npdata = {'Var1': [True, False, True, False, True, False, True, False, True],        'Var2': [1, 2, 3, 1, 2, 3, 1, 2, 3],        'Var3': ['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'],        'Value': [12, 93, 28, 23, 94, 12, 85, 23, 2]}df = pd.DataFrame(data)df = df.groupby(["Var1", "Var2", "Var3"]).agg(    Med=("Value", "median"),    Mean=("Value", "mean"),    Count=("Value", "count"),    q90=("Value", lambda x: x.quantile(q=0.9)),    q10=("Value", lambda x: x.quantile(q=0.1)),)df = df.reindex(    pd.MultiIndex.from_product(        [[True, False], [1, 2, 3], ["A", "B", "C"]], names=["Var1", "Var2", "Var3"]    ))for _, g in df.groupby(level=[0, 1, 2]):    print(g)    print("-" * 80)

注意事项

确保在计算分位数时,数据类型是数值型。如果数据类型是字符串,需要先转换为数值型。如果某些组的数据量很小,计算出的分位数可能没有意义。reindex() 方法可以确保所有可能的组合都存在于结果中,但如果组合的数量非常大,可能会导致内存占用过高。

总结

本文介绍了如何使用 Pandas 库对 DataFrame 中多个列的组合进行分组,并计算每个组合的统计数据。通过 groupby() 和 agg() 函数的灵活运用,以及 MultiIndex 的构建,可以高效地完成数据分析任务。这种方法在处理需要对数据进行多维度分析的场景中非常有用。

以上就是Pandas DataFrame 多列组合统计数据计算与分组展示的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 15:58:34
下一篇 2025年12月14日 15:58:42

相关推荐

  • 如何在Golang中实现自动化扩容策略

    答案:在Golang中实现自动化扩容需结合监控指标、决策逻辑与资源管理接口。首先通过Prometheus、cgroup或云服务采集CPU、内存、QPS等指标;接着定义阈值或滑动窗口策略判断扩容时机,如CPU持续超80%则触发;使用client-go调用Kubernetes API或云平台SDK调整副…

    2025年12月16日
    000
  • 如何在Golang中优化gRPC吞吐量

    提升gRPC吞吐量需优化并发控制、序列化、网络连接与监控。1. 服务端设置MaxConcurrentStreams并控制goroutine数量;2. 启用gzip压缩与高效IDL设计;3. 复用客户端连接,调整TCP参数与keepalive;4. 结合pprof与Prometheus定位瓶颈,持续调…

    2025年12月16日
    000
  • Golang如何优化云原生应用内存使用

    Go语言因高效并发和简洁语法广泛用于云原生,但需优化内存以避免高GC压力。应减少小对象分配,如用strings.Builder拼接字符串、值类型传参、预分配slice容量;通过sync.Pool复用对象,注意其非持久性;合理设计数据结构,避免内存泄漏,使用ID替代大对象引用,优化字段对齐;调整GOG…

    2025年12月16日
    000
  • 如何在Golang中使用encoding/csv处理CSV文件

    答案:Go语言的encoding/csv包可读写CSV文件,支持自定义分隔符。使用csv.NewReader读取数据,ReadAll()适合小文件,大文件应逐行Read;csv.NewWriter写入需调用Flush()确保数据保存;设置Comma字段可更换分隔符;自动处理含逗号、引号的字段。 在G…

    2025年12月16日
    000
  • Go语言uint64:固定内存与变长序列化深度解析

    本文深入探讨go语言中uint64类型的存储机制。在内存中,uint64始终占用8字节的固定空间。然而,在进行序列化时,如使用binary.putuvarint函数,uint64可能会被编码为可变长度的字节序列,最多可达10字节。文章将详细解释这两种情况的差异及其背后的设计原理,并通过示例代码加深理…

    2025年12月16日
    000
  • Go语言程序高内存占用之谜:解析虚拟内存与运行时管理

    许多Go语言初学者在运行简单程序时,可能会观察到其内存占用数据远高于预期,甚至比C语言同等程序高出数十倍。这并非Go程序实际消耗了大量物理内存,而是Go运行时为了效率和未来的内存分配,会预先向操作系统申请一块较大的虚拟内存空间。本文将深入探讨Go语言的内存管理机制,区分虚拟内存与实际物理内存的概念,…

    2025年12月16日
    000
  • Go语言中结构体内容到uint64的安全转换:避免unsafe包

    本文探讨了在go语言中,如何将一个8字节的结构体内容安全地复制到`uint64`类型,以及如何从`uint64`恢复到结构体,而无需使用`unsafe`包。核心方法是利用位操作(位移和位或)手动进行字节的打包与解包,同时强调了字节序(endianness)在跨类型数据转换中的关键作用,并提供了详细的…

    2025年12月16日
    000
  • Go语言并发模式:实现一生产者多消费者(Fan-Out)

    本文深入探讨Go语言中实现“一生产者多消费者”(Fan-Out)并发模式的方法。通过构建一个核心的`fanOut`函数,我们将学习如何将单一输入通道的数据复制并分发到多个输出通道,从而允许不同的消费者并行处理相同的数据副本。文章将详细阐述通道的创建、数据分发、缓冲机制对消费者滞后量的影响,以及在输入…

    2025年12月16日
    000
  • 如何在Golang中优化函数调用开销

    优化Go函数调用性能需减少开销并合理利用编译器特性:1. 避免频繁调用小函数,热点路径可内联处理,用go build -gcflags=”-m”查看内联情况;2. 大结构体传参使用指针避免值拷贝,但小结构体不宜盲目转指针;3. 通过逃逸分析减少堆分配,局部变量尽量留在栈上,可…

    2025年12月16日
    000
  • Go语言:安全高效地获取与解析HTTP JSON响应

    本教程将指导您如何在go语言中安全高效地从http get请求中获取并解析json数据。我们将重点介绍使用json.newdecoder直接处理响应体以提高效率,并强调配置http.client超时机制的重要性,以避免程序因网络延迟或服务器无响应而挂起,从而提升应用程序的健壮性。 Go语言在处理网络…

    2025年12月16日
    000
  • Go语言中高效清空切片的方法与实践

    本文详细探讨了go语言中清空切片的两种主要方法:通过切片表达式截断(`slice = slice[:0]`)和将其设置为`nil`(`slice = nil`)。我们将深入分析这两种方法的内部机制、对内存管理和性能的影响,以及各自的最佳应用场景,旨在帮助开发者根据具体需求选择最合适的清空策略,以实现…

    2025年12月16日
    000
  • Go语言中清空切片(Slice)的策略与实践

    go语言中清空切片有两种核心策略:通过`slice = slice[:0]`重置长度以保留底层数组进行重用,或通过`slice = nil`完全释放底层内存并解除别名。本文将深入解析这两种方法的机制、应用场景及其对内存管理、垃圾回收和性能的影响,并提供代码示例,旨在帮助开发者根据具体需求做出明智选择…

    2025年12月16日
    000
  • 如何在Golang中使用指针进行内存优化

    合理使用指针可减少内存拷贝、提升性能,尤其在处理大结构体或共享数据时。1. 传递大对象应使用指针避免值拷贝;2. 多实例共享配置等数据时用指针减少重复分配;3. 结构体中大字段或可选字段宜定义为指针以优化内存布局;4. 避免滥用指针导致GC压力或内存泄漏,小对象优先传值。 在Golang中,合理使用…

    2025年12月16日
    000
  • Golang如何使用享元模式减少对象开销

    享元模式通过共享内部状态减少对象创建开销,适用于大量相似对象场景。在Golang中,将字体等不变属性作为内部状态由TextRenderer持有,位置和内容等可变数据作为外部状态传入Render方法。RendererFactory使用map缓存实例,按字体配置复用渲染器,避免重复创建。10000个字符…

    2025年12月16日
    000
  • Golang Memento备忘录模式状态保存实践

    Memento模式通过封装对象状态实现撤销功能,文中以Go语言文本编辑器为例,展示Originator(编辑器)、Memento(状态快照)和Caretaker(历史管理)的协作,支持安全的状态回滚与恢复。 在Go语言开发中,当需要保存和恢复对象的内部状态时,Memento(备忘录)模式是一种优雅的…

    2025年12月16日
    000
  • Go语言子字符串的内存管理与高效复制:避免潜在的内存泄露

    go语言中的子字符串操作默认不分配新内存,而是共享原始字符串的底层数据。这种机制虽然高效,但可能导致垃圾回收器无法释放不再需要的原始大字符串内存,引发内存泄露。本文将深入探讨这一机制,并提供一种惯用且高效的方法——通过转换为字节切片再转回字符串,实现子字符串的独立复制,从而优化内存管理。 Go语言中…

    2025年12月16日
    000
  • Go 语言字符串截取与内存管理:避免意外的内存泄漏

    本文深入探讨了 Go 语言中字符串截取的内存管理机制,重点分析了截取操作如何共享底层数据,以及由此可能引发的内存泄漏问题。我们将提供一种高效且符合 Go 语言习惯的方式来创建字符串截取的副本,从而避免不必要的内存占用,并确保程序的健壮性。 在 Go 语言中,字符串的截取操作并非创建全新的字符串,而是…

    2025年12月16日
    000
  • Go并发模式:详解Fan-Out(一生产者多消费者)

    本文深入探讨go语言中的fan-out并发模式,演示如何通过通道实现一生产者向多消费者分发数据副本。文章详细介绍了`fanout`函数的实现,包括创建缓冲通道以控制消费者滞后、数据分发协程的运作,以及在输入通道耗尽后正确关闭所有输出通道的关键机制,确保资源有效管理与并发流程的顺畅。 什么是Fan-O…

    2025年12月16日
    000
  • Golang并发性能调优有哪些技巧

    合理控制Goroutine数量,使用协程池或带缓冲channel限流,避免资源耗尽;减少锁竞争,优先用sync.Mutex缩小临界区,读多写少场景用sync.RWMutex,简单操作用sync/atomic,大资源用分片锁;高效使用channel,根据场景选择是否带缓冲,及时关闭防止泄漏,用sele…

    2025年12月16日
    000
  • Golang:高效地通过Channel传输压缩字节流

    本教程深入探讨在Go语言中如何高效地通过Channel传输压缩字节流。我们将摒弃低效的单字节传输,转而采用字节切片([]byte)进行数据块传输,并通过自定义实现io.Writer接口的ChanWriter类型,结合Goroutine实现异步压缩与并发安全的数据流传输。文章将提供详细的代码示例和最佳…

    2025年12月16日
    000

发表回复

登录后才能评论
关注微信