Python怎么用pandas对数据进行分组_pandas DataFrame数据分组聚合操作

Pandas的groupby()可按列分组数据并应用聚合函数如sum、mean等,支持多级分组、agg多种聚合、transform组内转换及apply自定义函数,默认排除NaN值,可用fillna填充,结合sort_values和head可获取每组前N条,transform还能将结果合并回原DataFrame。

python怎么用pandas对数据进行分组_pandas dataframe数据分组聚合操作

Pandas 中使用

groupby()

方法可以轻松实现数据分组,然后配合聚合函数进行统计分析。这是一种非常强大的数据处理工具,能让你快速了解数据的不同维度。

解决方案

Pandas 的

groupby()

函数允许你根据一个或多个列的值对 DataFrame 进行分组。分组后,你可以对每个组应用聚合函数,例如

sum()

,

mean()

,

count()

,

min()

,

max()

等。

以下是一些常用的 Pandas 分组聚合操作示例:

立即学习“Python免费学习笔记(深入)”;

import pandas as pd# 创建一个示例 DataFramedata = {'Category': ['A', 'A', 'B', 'B', 'A', 'C', 'C'],        'Value': [10, 15, 20, 25, 12, 30, 35],        'City': ['Beijing', 'Shanghai', 'Beijing', 'Shanghai', 'Guangzhou', 'Shanghai', 'Guangzhou']}df = pd.DataFrame(data)# 按照 'Category' 列进行分组,并计算每组 'Value' 的总和grouped_sum = df.groupby('Category')['Value'].sum()print("按照 Category 分组求和:n", grouped_sum)# 按照 'Category' 列进行分组,并计算每组 'Value' 的平均值grouped_mean = df.groupby('Category')['Value'].mean()print("n按照 Category 分组求平均值:n", grouped_mean)# 按照 'Category' 和 'City' 列进行分组,并计算每组 'Value' 的总和grouped_multi = df.groupby(['Category', 'City'])['Value'].sum()print("n按照 Category 和 City 分组求和:n", grouped_multi)# 使用 agg 函数进行多种聚合操作grouped_agg = df.groupby('Category')['Value'].agg(['sum', 'mean', 'count'])print("n使用 agg 函数进行多种聚合操作:n", grouped_agg)# 对不同的列应用不同的聚合函数grouped_diff_agg = df.groupby('Category').agg({'Value': 'sum', 'City': 'nunique'})print("n对不同的列应用不同的聚合函数:n", grouped_diff_agg)# 使用 transform 进行组内转换df['Category_Mean'] = df.groupby('Category')['Value'].transform('mean')print("n使用 transform 进行组内转换:n", df)# 使用 apply 应用自定义函数def custom_function(x):    return x.max() - x.min()grouped_apply = df.groupby('Category')['Value'].apply(custom_function)print("n使用 apply 应用自定义函数:n", grouped_apply)

Pandas 分组后如何处理缺失值 (NaN)?

在分组聚合操作中,如果数据包含缺失值 (NaN),

groupby()

默认会将 NaN 值排除在外。这意味着 NaN 值不会参与到聚合计算中。

排除 NaN (默认行为):

groupby()

默认跳过 NaN 值。 如果一个组内的所有值都是 NaN,那么聚合结果也会是 NaN。填充 NaN: 你可以在分组之前使用

fillna()

方法填充 NaN 值。例如,使用组内的平均值或中位数填充。

import pandas as pdimport numpy as npdata = {'Category': ['A', 'A', 'B', 'B', 'A'],        'Value': [10, np.nan, 20, 25, 12]}df = pd.DataFrame(data)# 默认行为:排除 NaNgrouped_sum = df.groupby('Category')['Value'].sum()print("排除 NaN:n", grouped_sum)# 填充 NaN 值 (使用组内平均值)df['Value'] = df.groupby('Category')['Value'].transform(lambda x: x.fillna(x.mean()))grouped_sum_filled = df.groupby('Category')['Value'].sum()print("n填充 NaN 后求和:n", grouped_sum_filled)

如何对分组后的数据进行排序,并获取每组的前 N 个值?

有时候,你需要对每个分组内的数据进行排序,然后提取每组的前 N 个值。 这在很多场景下都很有用,例如找出每个类别下销量最高的前几名产品。

import pandas as pddata = {'Category': ['A', 'A', 'A', 'B', 'B', 'B'],        'Value': [10, 15, 5, 20, 25, 18]}df = pd.DataFrame(data)# 按照 Category 分组,并对 Value 降序排序,获取每组的前 2 个值def top_n(df, n=2):    return df.sort_values(by='Value', ascending=False).head(n)top_2 = df.groupby('Category').apply(top_n)print(top_2)# 如果想重置索引,可以这样做top_2 = df.groupby('Category').apply(top_n).reset_index(drop=True)print("n重置索引后:n", top_2)

分组聚合后,如何将结果合并回原始 DataFrame?

transform()

函数非常适合这种场景。 它可以将聚合后的结果广播回原始 DataFrame,保持索引对齐。

import pandas as pddata = {'Category': ['A', 'A', 'B', 'B', 'A'],        'Value': [10, 15, 20, 25, 12]}df = pd.DataFrame(data)# 计算每个 Category 的平均值,并将结果合并回原始 DataFramedf['Category_Mean'] = df.groupby('Category')['Value'].transform('mean')print(df)

这个方法避免了手动合并的麻烦,而且效率很高。

transform()

保持了 DataFrame 的结构,使得后续分析更加方便。

以上就是Python怎么用pandas对数据进行分组_pandas DataFrame数据分组聚合操作的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 11:47:58
下一篇 2025年12月14日 11:48:05

相关推荐

  • Go项目构建后访问页面404的原因是什么?如何解决?

    Go项目构建后404错误排查与解决 Go语言项目构建完成后,访问页面出现404错误是常见问题。本文将深入探讨其原因和解决方法。 问题描述 Go项目构建(例如使用go build -o test .命令)后部署到服务器,访问页面却返回404错误。怀疑原因是静态文件(HTML、CSS、JavaScrip…

    2025年12月15日
    000
  • 如何优雅地扩展Gin框架Context以自定义响应方法?

    Gin框架Context扩展:简化自定义响应 在Go语言Gin框架的Web开发中,经常需要自定义响应方法。例如,反复编写类似 c.JSON(http.StatusBadRequest, gin.H{“error”: “上传失败”}) 的代码既冗余又难以维护。本文介绍一种优雅的方案:通过扩展Gin的C…

    2025年12月15日
    000
  • 如何将Go语言HTTP请求返回的Unicode编码转换为可读的中文字符?

    Go语言HTTP请求:解决中文Unicode显示问题 使用Go语言进行HTTP请求时,有时服务器返回的中文内容会以Unicode编码显示,例如“u5f20u4e09”代替“张三”。这是因为服务器返回的UTF-8编码数据未被客户端正确解码。本文提供解决方案。 假设post函数已实现HTTP POST请…

    2025年12月15日
    000
  • 技术栈收敛与技术栈选型之间有什么关系?

    技术栈收敛与选型:动态的平衡 技术栈选型是项目启动时的关键决策,决定了项目使用的技术工具和框架。而技术栈收敛则是一个持续优化的过程,它建立在选型的基础上,通过精简、迁移和更新技术栈,最终达到高效、易维护的目标。 收敛并非选型的简单重复 技术栈收敛并非仅仅是技术栈选型的重复。它更像是一个动态的平衡过程…

    2025年12月15日
    000
  • Go语言自定义日志函数Printf参数传递:如何正确格式化输出?

    Go语言自定义日志函数:Printf参数传递及格式化输出详解 在Go语言开发中,自定义日志函数能有效提升日志管理效率。本文将分析一个常见的log.Printf函数参数传递问题,并提供解决方案。 问题: 开发者为了灵活控制日志输出,封装了log.Printf函数,创建了debugf函数。但实际使用中,…

    2025年12月15日
    000
  • 如何解决Go语言使用RabbitMQ时频繁初始化连接和通道导致的内存问题?

    Go语言RabbitMQ连接池:避免内存泄漏的最佳实践 在使用Go语言与RabbitMQ交互时,频繁创建和销毁连接与通道会导致严重的内存问题,尤其在高并发场景下。本文探讨如何通过连接池机制有效解决此问题,提升应用性能和稳定性。 问题重现:高并发下的内存膨胀 假设一个Go接口负责将数据写入Rabbit…

    2025年12月15日
    000
  • 在Go中如何正确处理Mysql和Redis资源的释放?

    Go语言中MySQL和Redis资源的优雅释放 在Go语言中,尤其是在构建API接口时,正确管理MySQL和Redis连接资源至关重要。本文将通过示例代码,阐述如何有效地处理这些资源的释放,避免资源泄漏。 背景知识 Go语言API接口开发经常涉及到MySQL和Redis数据库连接。不恰当的资源管理可…

    2025年12月15日
    000
  • Go模板引擎数据传递:如何摆脱PHP的assign方法实现数据渲染?

    go模板引擎数据传递:告别php的assign方法,轻松实现数据渲染 本文讲解如何使用Go模板引擎(text/template)传递数据,并对比PHP的assign方法,帮助熟悉PHP的开发者理解Go模板的赋值机制。 在PHP中,我们习惯使用assign方法将变量传递给模板。但在Go中,text/t…

    2025年12月15日
    000
  • 如何实现哈希映射以支持多维度映射和前缀查询?

    构建高效的多维度哈希映射及前缀查询方案 设计一个哈希映射函数,将多维度数据映射到唯一标识符(例如,f(a, b, c…) = uniqueid),同时支持根据前缀维度进行查询(例如,查找所有以 ‘a’ 开头的映射结果),是一个具有挑战性的任务。 本文探讨几种实现方…

    2025年12月15日
    000
  • Go语言中*号在类型声明中代表什么含义?

    Go语言指针详解及示例 在Go语言中,*号在类型声明中表示指针类型。它与作为取值操作符的*有所不同,在类型声明中,*表示声明的变量是一个指针,指向某个特定数据类型的内存地址。 让我们通过一个例子来理解: package mainimport “fmt”type Employee struct { I…

    2025年12月15日
    000
  • Python和Golang协程:实现方式有何不同及优劣如何?

    python与golang协程的差异探究 本文将深入探讨python和golang协程的异同。虽然两种语言都支持协程,实现协程的概念也一致——非阻塞、非独占地共享cpu时间片——但其具体的实现方式和使用体验却存在显着区别。 首先,需要明确的是,无论哪种语言,协程的核心概念都是相同的。它允许程序并发执…

    好文分享 2025年12月15日
    000
  • 如何在Go中定义公共接口并处理不同参数类型的相同方法?

    如何在go中定义公共接口并处理不同参数类型的相同方法 在go编程中,定义接口并约束其实现方法是一种常见且有效的设计模式。然而,当面对多个接口具有相同方法但参数类型不同时,如何定义一个公共接口并实现这些方法是一个有趣的问题。 问题描述 假设我们有两个接口,iaxx和ibxx,这两个接口都包含了crea…

    好文分享 2025年12月15日
    000
  • 在protobuf中如何为枚举类型定义字符串常量?

    Protocol Buffer 枚举类型的字符串常量定义 在使用 Protocol Buffers (protobuf) 时,经常需要为枚举类型定义对应的字符串常量,以增强代码的可读性和可维护性。Protobuf 本身并不直接支持在定义枚举时同时定义字符串常量,但生成的代码会提供必要的映射关系。本文…

    2025年12月15日
    000
  • 如何在Go中定义公共接口并处理不同参数类型的方法实现?

    Go语言公共接口与不同参数类型方法实现详解 在Go语言中,定义公共接口并处理不同参数类型的方法实现是一个常见的挑战。本文将探讨如何优雅地解决这个问题,避免使用interface{}带来的类型不安全问题。 问题描述 假设我们有两个接口IAxx和IBxx,它们都包含Create和Update方法。但Cr…

    2025年12月15日
    000
  • 多云主机间目录共享:NFS还是FastDFS?哪个更适合简单高效的文件共享?

    多云主机间高效目录共享方案:NFS胜出 跨多云服务器共享目录并方便地用Go或Python访问,是常见的运维需求。本文分析如何构建稳定、易部署的开源解决方案,并评估FastDFS的适用性。 需求:在多云主机间共享目录,需提供Go/Python SDK,性能要求不高,但稳定性和易部署性至关重要。 推荐方…

    2025年12月15日
    000
  • Go语言代码修改后无需重启?有哪些方法可以实现热重载?

    go语言热重载:告别手动重启,提升开发效率! 还在为Go语言代码修改后需要手动重启而烦恼吗? 每次Ctrl+C终止程序,再重新运行go run *.go,是不是效率低下? 别担心!Go语言也支持热重载功能,让您体验类似PHP的开发效率。 本文介绍如何使用热重载工具(例如air)实现Go代码修改后自动…

    2025年12月15日
    000
  • 在Go语言中,同包文件如何互相调用小写函数?

    Go语言同包文件小写函数调用详解 本文探讨在Go语言项目中,如何在一个包内不同文件间调用函数,特别是小写(非导出)函数。 假设我们有一个名为gin_demo的项目,结构如下: gin_demo├── app│ └── blog│ ├── handler.go│ └── router.go├── go…

    2025年12月15日
    000
  • 如何使用Go语言将字符串转换为二进制并写入文件?

    Go语言:字符串转二进制并写入文件 在数据存储场景中,经常需要将字符串转换为二进制格式保存到文件中,例如Redis的RDB文件。本文演示如何使用Go语言将字符串“redis”转换为二进制并写入文件,并在Vim中使用%!xxd命令查看其十六进制表示。 无需借助binary包,Go语言可以直接将字符串写…

    2025年12月15日
    000
  • Go、Java等高级语言如何无汇编实现高效协程?

    深入探讨go、java等高级语言协程实现机制 本文将深入探讨Go、Java等高级语言在没有内联汇编的情况下如何实现协程,特别是针对“没有内联汇编,Go、Java等语言如何实现有栈协程”这一问题进行解答。 我们知道,Python的greenlet库通过C语言加内联汇编来实现协程,通过直接操作寄存器完成…

    好文分享 2025年12月15日
    000
  • 如何在Go语言中高效替换字符串中的图片链接并上传到阿里云OSS?

    如何提升go语言中替换字符串图片链接的性能? 在处理大量包含图片链接的字符串时,如何高效地替换这些图片链接并上传到阿里云oss是许多开发者面临的挑战。以下是一个具体的场景:我们有一个字符串,里面包含多个标签,每个标签内都有一个图片链接。我们的任务是将这些图片链接替换为上传到阿里云oss后的新链接。为…

    2025年12月15日 好文分享
    000

发表回复

登录后才能评论
关注微信