Pandas深度解析GroupBy函数的妙用技巧【第75篇—GroupBy函数】

news2024/11/24 16:59:53

Pandas深度解析GroupBy函数的妙用技巧

数据处理和分析中,Pandas是一款非常强大的Python库,提供了丰富的数据结构和功能,使得数据分析变得更加简便高效。其中,GroupBy函数是Pandas中一个重要且常用的功能,通过它我们可以轻松地对数据进行分组操作。在本篇技术博客中,我们将深入探讨Pandas的GroupBy函数,并通过实际案例展示其强大的应用。

image-20240212171320415

1. GroupBy函数简介

GroupBy函数是Pandas库中用于数据分组的核心工具之一。它的工作原理是将数据按照指定的列或条件进行分组,然后在每个组上应用相应的函数。这为我们提供了在数据集中执行汇总、计算统计量以及其他聚合操作的便捷方式。

2. GroupBy函数的基本用法

让我们从一个简单的例子开始,首先导入Pandas库并创建一个包含多个组的数据集:

import pandas as pd

data = {'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
        'Value': [10, 20, 15, 25, 12, 18]}
df = pd.DataFrame(data)

现在,我们可以使用GroupBy函数按照 ‘Category’ 列进行分组,并计算每个组的平均值:

grouped_data = df.groupby('Category')
mean_values = grouped_data.mean()
print(mean_values)

这将输出每个类别的平均值:

          Value
Category       
A           12.333333
B           21.000000

image-20240212171420832

3. 高级应用:自定义聚合函数

GroupBy函数不仅限于内置的聚合函数,我们还可以使用自定义的函数进行聚合。考虑以下例子,我们想要计算每个组的数据范围:

def data_range(series):
    return series.max() - series.min()

range_values = grouped_data['Value'].agg(data_range)
print(range_values)

这将输出每个类别的数据范围:

Category
A    5
B    7
Name: Value, dtype: int64

通过自定义聚合函数,我们可以灵活地对数据进行更复杂的统计分析。

image-20240212171438569

4. 多列分组

有时候,我们需要根据多列进行分组。例如,我们想要按照 ‘Category’ 和 ‘Subcategory’ 列对数据进行分组:

data = {'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
        'Subcategory': ['X', 'Y', 'X', 'Y', 'X', 'Y'],
        'Value': [10, 20, 15, 25, 12, 18]}
df = pd.DataFrame(data)

grouped_data = df.groupby(['Category', 'Subcategory'])
mean_values = grouped_data.mean()
print(mean_values)

这将输出按照两列进行分组的平均值:

                   Value
Category Subcategory       
A        X            11
         Y            15
B        X            19
         Y            21

image-20240212171459220

5. 数据透视表和GroupBy的关系

Pandas的GroupBy函数与数据透视表(Pivot Table)之间存在密切的关系。通过GroupBy函数,我们可以实现类似数据透视表的功能,但更加灵活。考虑以下例子,我们想要统计每个类别和子类别的平均值:

pivot_table = df.pivot_table(values='Value', index=['Category', 'Subcategory'], aggfunc='mean')
print(pivot_table)

上述代码使用数据透视表实现了相同的效果,但使用GroupBy函数也能达到相似的结果:

grouped_data = df.groupby(['Category', 'Subcategory'])
mean_values = grouped_data.mean()
print(mean_values)

通过这两种方式,我们可以选择更适合特定需求的方法,展示了GroupBy函数的灵活性。

6. 处理缺失值的分组

在实际数据分析中,我们经常会面临缺失值的情况。GroupBy函数对于处理缺失值同样提供了一些方便的方法。例如,我们可以使用dropna()方法剔除包含缺失值的组:

df_with_missing = pd.DataFrame({'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
                                'Value': [10, 20, 15, None, 12, 18]})
grouped_data = df_with_missing.groupby('Category').dropna()
print(grouped_data.mean())

在上述例子中,缺失值所在的组会被从计算中排除,确保了分组统计的准确性。

7. 分组后的数据可视化

Pandas的GroupBy函数与数据可视化库(如Matplotlib、Seaborn等)的结合,可以更直观地展示分组后的数据。让我们以柱状图为例,展示每个类别的平均值:

import matplotlib.pyplot as plt

# 使用前面创建的 grouped_data
mean_values.plot(kind='bar', ylabel='Mean Value', title='Average Value by Category', rot=0)
plt.show()

通过这样的可视化,我们可以清晰地看到不同类别的平均值,并更容易进行数据解读和传达。

image-20240212171521357

8. 分组与时间序列数据

当处理时间序列数据时,GroupBy函数同样非常有用。考虑以下例子,我们有一个包含日期和值的数据集,想要按照年份进行分组:

date_rng = pd.date_range('2022-01-01', '2023-01-01', freq='M')
ts_data = pd.DataFrame({'Date': date_rng, 'Value': range(len(date_rng))})

# 按照年份进行分组
ts_data['Year'] = ts_data['Date'].dt.year
grouped_data = ts_data.groupby('Year').sum()
print(grouped_data)

通过这种方式,我们可以按照年份对时间序列数据进行有效的分组和汇总。

9. 高级分组操作:Transform和Filter

除了基本的聚合操作之外,Pandas的GroupBy对象还支持一些高级的分组操作,例如Transform和Filter。

9.1 Transform

Transform允许我们在分组的每个子集上执行一些操作,并将结果广播回原始的DataFrame。考虑以下例子,我们想要对每个类别的数据进行标准化:

# 使用前面创建的 df
standardize = lambda x: (x - x.mean()) / x.std()
df['Standardized_Value'] = df.groupby('Category')['Value'].transform(standardize)
print(df)

这里,我们定义了一个标准化的匿名函数,并通过Transform将其应用到每个类别的数据中,得到标准化后的值。这对于在组级别进行操作并将结果合并回原始数据集非常有用。

9.2 Filter

Filter允许我们根据组的特性来过滤数据。例如,我们想要保留那些组内数据量大于2的类别:

filtered_data = df.groupby('Category').filter(lambda x: len(x) > 2)
print(filtered_data)

这样,我们只保留了数据量大于2的类别,过滤掉了其他类别的数据。

10. 多级索引与层次化分组

Pandas还支持多级索引,这使得我们能够在多个层次上对数据进行分组。例如,我们可以按照 ‘Category’ 和 ‘Subcategory’ 列创建多级索引:

multi_level_grouped_data = df.set_index(['Category', 'Subcategory']).groupby(level=[0, 1])
print(multi_level_grouped_data.mean())

这样,我们就能够在多个层次上进行分组操作,更灵活地组织和分析数据。

11. 分组的性能优化与注意事项

在处理大型数据集时,分组操作可能成为性能瓶颈。为了提高性能,Pandas提供了一些优化策略,同时我们也需要注意一些潜在的问题。

11.1 分组的性能优化

Pandas提供了一些方法来优化分组操作。其中,使用as_index=False参数可以避免将分组依据列变成索引,从而提高性能:

df.groupby('Category', as_index=False).mean()

此外,使用sort=False参数可以禁用分组结果的排序,有助于提高效率:

df.groupby('Category', sort=False).mean()
11.2 注意事项:数据类型与内存占用

在进行分组操作时,要注意数据的类型和内存占用。确保分组列的数据类型是合适的,不要过度消耗内存。另外,使用合适的数据类型能够提高分组操作的速度。

11.3 小心处理大量组

在处理大量组时,一些操作可能会变得较为耗时。对于这种情况,考虑使用dask等工具进行并行处理,以加速分组操作。

12. GroupBy对象的属性与方法

除了上述介绍的基本用法和高级操作外,GroupBy对象还有一些其他有用的属性和方法。例如,我们可以通过groups属性查看分组后的组索引:

grouped_data = df.groupby('Category')
print(grouped_data.groups)

通过size()方法获取每个组的大小:

group_sizes = grouped_data.size()
print(group_sizes)

这些属性和方法可以帮助我们更好地了解和操作分组后的数据。

总结

在本文中,我们深入探讨了Pandas的强大功能之一,即GroupBy函数。从基础的分组操作开始,我们学习了如何按照指定的列对数据进行分组,并进行各种聚合操作。通过实际案例,我们展示了GroupBy函数的基本用法,包括计算平均值、使用自定义聚合函数以及处理多列分组的情况。

随后,我们拓展了对GroupBy函数的理解,介绍了一些高级操作,包括Transform和Filter的应用。这些功能使我们能够更灵活地处理数据,例如在组内执行标准化操作或过滤出符合条件的数据。同时,我们探讨了多级索引的使用,为复杂数据集的组织和分析提供了更多的选择。

除了功能的介绍,我们关注了性能优化和注意事项,以确保在处理大型数据集时能够更高效地利用GroupBy函数。通过使用合适的参数和注意数据类型,我们可以有效地提高分组操作的执行速度。

最后,我们介绍了GroupBy对象的一些属性和方法,帮助读者更好地了解和操作分组后的数据。这些工具为数据科学家和分析师提供了更多的操作手段,使得数据分析和处理变得更加灵活和高效。

总体而言,通过本文,读者应该对Pandas的GroupBy函数有了全面的了解,能够灵活运用于实际项目中。无论是基础用法、高级操作、性能优化,还是GroupBy对象的属性和方法,这篇文章旨在帮助读者更好地掌握这一重要的数据处理工具,使其在数据科学领域更上一层楼。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1445488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第四节课[XTuner微调]作业

文章目录 前言作业基础作业-XTuner InternLM-Chat 个人小助手认知微调实践 前言 XTuner 做在第三节课LangChain作业之前,因为第三节课没想好找哪个领域,等第三节课作业做了一起部署。 作业 基础作业-XTuner InternLM-Chat 个人小助手认知微调实践 然…

Ps:直接从图层生成文件(图像资源)

通过Ps菜单:文件/导出/将图层导出到文件 Layers to Files命令,我们可以快速地将当前文档中的每个图层导出为同一类型、相同大小和选项的独立文件。 Photoshop 还提供了一个功能,可以基于文档中的图层或图层组的名称,自动生成指定大…

渗透专用虚拟机(公开版)

0x01 工具介绍 okfafu渗透虚拟机公开版。解压密码:Mrl64Miku,压缩包大小:15.5G,解压后大小:16.5G。安装的软件已分类并在桌面中体现,也可以使用everything进行查找。包含一些常用的渗透工具以及一些基本工…

opencv图像像素的读写操作

void QuickDemo::pixel_visit_demo(Mat & image) {int w image.cols;//宽度int h image.rows;//高度int dims image.channels();//通道数 图像为灰度dims等于一 图像为彩色时dims等于三 for (int row 0; row < h; row) {for (int col 0; col < w; col) {if…

RabbitMQ之五种消息模型

1、 环境准备 创建Virtual Hosts 虚拟主机&#xff1a;类似于mysql中的database。他们都是以“/”开头 设置权限 2. 五种消息模型 RabbitMQ提供了6种消息模型&#xff0c;但是第6种其实是RPC&#xff0c;并不是MQ&#xff0c;因此不予学习。那么也就剩下5种。 但是其实3、4…

【数学建模】【2024年】【第40届】【MCM/ICM】【E题 财产保险的可持续性】【解题思路】

一、题目 &#xff08;一&#xff09; 赛题原文 2024 ICM Problem E: Sustainability of Property Insurance Extreme-weather events are becoming a crisis for property owners and insurers. The world has endured “more than $1 trillion in damages from more than …

尚硅谷 Vue3+TypeScript 学习笔记(下)

目录 五、组件通信 5.1. 【props】 5.2. 【自定义事件】 5.3. 【mitt】 5.4.【v-model】 5.5.【$attrs】 5.6. 【$refs、$parent】 5.7. 【provide、inject】 5.8. 【pinia】 5.9. 【slot】 1. 默认插槽 2. 具名插槽 3. 作用域插槽 六、其它 API 6.1.【shallowR…

Python学习从0到1 day16 Python文件操作

2024新年快乐&#xff01;&#xff01;&#xff01; 今天是大年初三&#xff0c;祝大家万事胜意&#xff0c;一切都会好的&#xff0c;休息了一段时间&#xff0c;从今天开始继续学习~ ​​​​​​​——24.2.12 一、文件的编码 计算机只能识别0和1&#xff0c;那么我们丰富的…

Spring Boot 笔记 002 整合mybatis做数据库读取

概念 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Java Objec…

并发CPU伪共享及优化

目录 伪共享 解决 伪共享 缓存系统中是以缓存行&#xff08;cache line&#xff09;为单位存储的。缓存行是2的整数幂个连续字节&#xff0c;一般为32-256个字节。最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时&#xff0c;如果这些变量共享同一个缓存行&am…

如何在 Windows 10/11 上恢复回收站永久删除的文件夹?

经验丰富的 Windows 用户将使用 Windows 备份和还原或文件历史记录来恢复不在回收站中的已删除文件夹。这些工具确实有助于 Windows 文件夹恢复&#xff0c;但并不总是有效。现在有许多专用的 Windows 数据恢复软件和免费解决方案可以替代它们&#xff0c;为 Windows 用户提供了…

前端vue 数字 字符串 丢失精度问题

1.问题 后端返回的数据 是这样的 一个字符串类型的数据 前端要想显示这个 肯定需要使用Json.parse() 转换一下 但是 目前有一个问题 转换的确可以 showId:1206381711026823172 有一个这样的字段 转换了以后 发现 字段成了1206381711026823200 精度直接丢了 原本的数据…

分享76个文字特效,总有一款适合您

分享76个文字特效&#xff0c;总有一款适合您 76个文字特效下载链接&#xff1a;https://pan.baidu.com/s/1rIiUdCMQScoRVKhFhXQYpw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

项目02《游戏-14-开发》Unity3D

基于 项目02《游戏-13-开发》Unity3D &#xff0c; 任务&#xff1a;战斗系统之击败怪物与怪物UI血条信息 using UnityEngine; public abstract class Living : MonoBehaviour{ protected float hp; protected float attack; protected float define; …

Ubuntu Desktop 自动获取 IP 地址

Ubuntu Desktop 自动获取 IP 地址 1. 左键单击网络图标 -> Edit Connections2. Network Connections3. Edit -> IPv4 SettingsReferences 1. 左键单击网络图标 -> Edit Connections 2. Network Connections ​​​ 3. Edit -> IPv4 Settings Automatic (DHCP) …

C++ shell - 在线 C++ 编译器

C shell - 在线 C 编译器 1. C shell2. Example program3. Options4. ExecutionReferences 1. C shell C Shell v2 https://cpp.sh/ https://cpp.sh/about.html C Shell v2, free online compiler, proudly uses emscripten to compile your code. emscripten is a clang-ba…

架构整洁之道-软件架构-展示器和谦卑对象、不完全边界、层次与边界、Main组件、服务

6 软件架构 6.9 展示器和谦卑对象 在《架构整洁之道-软件架构-策略与层次、业务逻辑、尖叫的软件架构、整洁架构》有我们提到了展示器&#xff08;presenter&#xff09;&#xff0c;展示器实际上是采用谦卑对象&#xff08;humble object&#xff09;模式的一种形式&#xff…

javaEE - 24( 20000 字 Servlet 入门 -2 )

一&#xff1a; Servlet API 详解 1.1 HttpServletResponse Servlet 中的 doXXX 方法的目的就是根据请求计算得到相应, 然后把响应的数据设置到HttpServletResponse 对象中. 然后 Tomcat 就会把这个 HttpServletResponse 对象按照 HTTP 协议的格式, 转成一个字符串, 并通过S…

(附源码)ssm面向过程性考核的高校课程实验系统-计算机毕设 00941

ssm面向过程性考核的高校课程实验系统 目 录 摘要 1 绪论 1.1背景及意义 1.2研究内容 1.3ssm框架介绍 2 1.4论文结构与章节安排 3 2 面向过程性考核的高校课程实验系统分析 4 2.1 可行性分析 4 2.2 系统流程分析 4 2.2.1数据增加流程 5 2.3.2数据修改流程 5 2.3.3数据删除…

2024.2.3 作业

1、实现单向循环链表的头插头删尾插尾删 #include<stdio.h> #include<string.h> #include<stdlib.h> typedef int datatype; typedef struct node {//数据域int data;//指针域struct node *next; }*Linklist; Linklist create() {Linklist s(Linklist)mallo…