【Python】进阶学习:pandas--groupby()用法详解

news/2024/7/23 10:10:05 标签: python, 学习, pandas

📊【Python】进阶学习pandas–groupby()用法详解

在这里插入图片描述

🌈 个人主页:高斯小哥
🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅和支持~
💡 创作高质量博文(平均质量分92+),分享更多关于深度学习、PyTorch、Python领域的优质内容!(希望得到您的关注~)


🌵文章目录🌵

  • 🤔 一、为什么需要groupby()?
  • 🎯 二、groupby()的基本用法
  • 📈 三、聚合运算
  • 🛠️ 四、高级用法与技巧
    • 🔧 应用自定义函数
    • 🔄 数据转换
    • 🔍 过滤数据
  • 🛠️ 五、实际案例应用
  • 🎉 六、总结
  • 🤝 七、期待与你共同进步

  👋 欢迎来到Python进阶学习之旅!今天,我们将深入探讨pandas库中非常强大的groupby()函数。groupby()函数在数据分析和数据清洗中发挥着关键作用,能够帮助我们轻松地对数据进行分组、聚合和转换。

🤔 一、为什么需要groupby()?

  在处理大量数据时,我们经常需要按照某个或多个特征对数据进行分组,以便更好地理解数据的结构和关系。例如,我们可能希望按照年份、地区或产品类别对数据进行分组,并对每个组进行聚合运算,如求和、平均值、最大值等。这时,groupby()函数就显得非常有用。

🎯 二、groupby()的基本用法

  首先,我们需要导入pandas库,并创建一个示例数据集。然后,我们可以使用groupby()函数按照指定的列对数据进行分组。

python">import numpy as np
import pandas as pd

# 创建一个简单的DataFrame
data = {
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'C': np.random.randn(8),
    'D': np.random.randn(8)
}
df = pd.DataFrame(data)

# 使用groupby按列'A'进行分组
grouped = df.groupby('A')


# 打印分组后的GroupBy对象
print(grouped)

输出:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002B2C070B8E0>

  上述代码将按照列’A’的值对DataFrame进行分组,并返回一个GroupBy对象。我们可以进一步对这个对象进行聚合运算。

📈 三、聚合运算

  GroupBy对象提供了多种聚合函数,如sum()mean()max()等。我们可以使用这些函数对每个组进行聚合运算。

python">import numpy as np
import pandas as pd

# 创建一个简单的DataFrame
data = {
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'C': np.random.randn(8),
    'D': np.random.randn(8)
}
df = pd.DataFrame(data)

# 使用groupby按列'A'进行分组
grouped = df.groupby('A')

# 打印分组后的对象
print(grouped)

# 计算每个组的平均值
mean_grouped = grouped.mean()
print(mean_grouped)

# 计算每个组的总和
sum_grouped = grouped.sum()
print(sum_grouped)

输出:

            C         D
A                      
bar  0.658173 -0.225388
foo  0.778100 -0.164148
           C         D
A                     
bar  1.97452 -0.676164
foo  3.89050 -0.820740

  除了内置的聚合函数外,我们还可以使用agg()函数应用自定义的聚合函数。例如,我们可以计算每个组的标准差:

python">import numpy as np
import pandas as pd

# 创建一个简单的DataFrame
data = {
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'C': np.random.randn(8),
    'D': np.random.randn(8)
}
df = pd.DataFrame(data)

# 使用groupby按列'A'进行分组
grouped = df.groupby('A')

# 打印分组后的对象
print(grouped)

# 计算每个组的标准差
std_grouped = grouped.agg(np.std)
print(std_grouped)

输出:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002B2F480B880>
            C         D
A                      
bar  0.101229  0.274698
foo  0.996597  0.812362

🛠️ 四、高级用法与技巧

  除了基本的分组和聚合操作外,groupby()还提供了许多高级功能,如应用自定义函数、转换数据等。

🔧 应用自定义函数

  我们可以使用apply()方法应用自定义函数到每个组。例如,我们可以定义一个函数来计算每个组的最大值和最小值之差:

python">import numpy as np
import pandas as pd

# 创建一个简单的DataFrame
data = {
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'C': np.random.randn(8),
    'D': np.random.randn(8)
}
df = pd.DataFrame(data)

# 使用groupby按列'A'进行分组
grouped = df.groupby('A')

# 打印分组后的对象
print(grouped)

# 定义一个自定义函数,计算每个组的最大值和最小值之差
def range_diff(group):
    return group.max() - group.min()

# 使用apply()应用自定义函数
diff_grouped = grouped.apply(range_diff)
print(diff_grouped)

输出:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x000002ACBD83AA60>
            C         D
A                      
bar  2.497695  1.086924
foo  2.826518  2.063781

🔄 数据转换

  groupby()还提供了transform()方法,用于将聚合运算的结果广播到原始数据的每一行。这在数据转换中非常有用。

python">import numpy as np
import pandas as pd

# 创建一个简单的DataFrame
data = {
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'C': np.random.randn(8),
    'D': np.random.randn(8)
}
df = pd.DataFrame(data)

# 使用groupby按列'A'进行分组
grouped = df.groupby('A')

# 打印分组后的对象
print(grouped)

# 使用transform()方法将每个组的平均值广播到原始数据的每一行
mean_transformed = grouped['C'].transform('mean')
print(mean_transformed)

# 将转换后的平均值添加到原始DataFrame中
df['C_mean'] = mean_transformed
print(df)

输出:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x00000188A56DA8E0>
0    0.344876
1   -1.358760
2    0.344876
3   -1.358760
4    0.344876
5   -1.358760
6    0.344876
7    0.344876
Name: C, dtype: float64
     A         C         D    C_mean
0  foo  0.783914 -1.027288  0.344876
1  bar -2.072893 -0.972087 -1.358760
2  foo  0.035637 -0.315908  0.344876
3  bar -1.953068  0.409697 -1.358760
4  foo  0.576048 -0.258289  0.344876
5  bar -0.050318 -1.115734 -1.358760
6  foo  0.093456  0.106227  0.344876
7  foo  0.235322  1.365150  0.344876

🔍 过滤数据

  除了聚合和转换外,我们还可以使用filter()方法根据条件过滤出满足条件的组。

python">import numpy as np
import pandas as pd

# 创建一个简单的DataFrame
data = {
    'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
    'C': np.random.randn(8),
    'D': np.random.randn(8)
}
df = pd.DataFrame(data)

# 使用groupby按列'A'进行分组
grouped = df.groupby('A')

# 打印分组后的对象
print(grouped)

# 使用filter()方法过滤出满足条件的组(例如,组的大小大于3)
filtered_groups = grouped.filter(lambda x: len(x) > 3)
print(filtered_groups)

输出:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000015ADE2FA940>
     A         C         D
0  foo  1.967217  0.005976
2  foo  0.950149  0.098143
4  foo  0.568101  1.461587
6  foo -1.905337 -1.106591
7  foo -0.168686  0.692850

🛠️ 五、实际案例应用

  最后,让我们通过一个实际案例来演示如何应用groupby()函数进行数据分析和清洗。

  假设我们有一个包含销售数据的DataFrame,其中包含日期、地区、产品名称、销售额等列。我们希望按地区和产品名称对数据进行分组,并计算每个组的总销售额。

python">import numpy as np
import pandas as pd

# 创建一个包含销售数据的DataFrame
sales_data = {
    'date': pd.date_range(start='2023-01-01', periods=100),
    'region': np.random.choice(['North', 'South', 'East', 'West'], size=100),
    'product': np.random.choice(['Product A', 'Product B', 'Product C'], size=100),
    'sales': np.random.rand(100) * 1000
}
df_sales = pd.DataFrame(sales_data)

# 按地区和产品名称对数据进行分组,并计算总销售额
grouped_sales = df_sales.groupby(['region', 'product'])['sales'].sum().reset_index()

# 打印分组后的销售额
print(grouped_sales)

输出:

   region    product        sales
0    East  Product A  2728.679432
1    East  Product B  1847.966730
2    East  Product C  4518.356763
3   North  Product A  5882.374531
4   North  Product B  5519.364196
5   North  Product C  4229.953852
6   South  Product A  5303.784425
7   South  Product B  2321.080682
8   South  Product C  4239.002167
9    West  Product A  1689.650513
10   West  Product B  4002.790867
11   West  Product C  4894.553548

  在这个案例中,我们首先创建了一个包含销售数据的DataFrame。然后,我们使用groupby()函数按地区和产品名称对数据进行分组,并使用sum()函数计算每个组的总销售额。最后,我们使用reset_index()函数将结果转换为一个新的DataFrame,并打印出来。

🎉 六、总结

  groupby()函数是pandas库中一个非常强大的工具,它允许我们按照一个或多个特征对数据进行分组,并对每个组进行聚合、转换和过滤操作。通过熟练掌握groupby()函数的用法,我们可以更高效地处理和分析大量数据,从而洞察数据的内在结构和关系。希望这篇博客能够帮助你更好地理解和应用groupby()函数!

🤝 七、期待与你共同进步

  🌱 亲爱的读者,非常感谢你每一次的停留和阅读!你的支持是我们前行的最大动力!🙏

  🌐 在这茫茫网海中,有你的关注,我们深感荣幸。你的每一次点赞👍、收藏🌟、评论💬和关注💖,都像是明灯一样照亮我们前行的道路,给予我们无比的鼓舞和力量。🌟

  📚 我们会继续努力,为你呈现更多精彩和有深度的内容。同时,我们非常欢迎你在评论区留下你的宝贵意见和建议,让我们共同进步,共同成长!💬

  💪 无论你在编程的道路上遇到什么困难,都希望你能坚持下去,因为每一次的挫折都是通往成功的必经之路。我们期待与你一起书写编程的精彩篇章! 🎉

  🌈 最后,再次感谢你的厚爱与支持!愿你在编程的道路上越走越远,收获满满的成就和喜悦!祝你编程愉快!🎉


http://www.niftyadmin.cn/n/5404265.html

相关文章

【SpringBean】bean的作用域和bean的生命周期

目录 前言 一 bean的作用域 1. singleton——唯一 bean 实例 2. prototype——每次请求都会创建一个新的 bean 实例 3. request——每一次HTTP请求都会产生一个新的bean&#xff0c;该bean仅在当前HTTP request内有效 4. session——每一次HTTP请求都会产生一个新的 bean&…

GO泛型相关

通过引入 类型形参 和 类型实参 这两个概念&#xff0c;我们让一个函数获得了处理多种不同类型数据的能力&#xff0c;这种编程方式被称为 泛型编程。 2. Go的泛型 类型形参 (Type parameter)类型实参(Type argument)类型形参列表( Type parameter list)类型约束(Type constr…

Java 打包 SpringBoot 项目报错

Java 打包 SpringBoot 项目报错 问题重现 Please refer to xxxx for the individual test results. Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream. 解决问题 在 pom.xml 的 <properties> 中添加项目代码 <s…

动态给vue的data添加新属性页面不更新的原因分析以及解决方法

直接添加属性的问题 我们从一个例子触发 定义一个p标签&#xff0c;通过v-for指令进行遍历&#xff0c;然后通过绑定事件&#xff0c;触发事件的时候&#xff0c;将动态添加哟个属性。 预期结果&#xff1a;动态增加的属性也被遍历显示在页面上 <p v-for"(value,ke…

c# 任务(Task)介绍

任务&#xff08;Task&#xff09; Task作为C#异步的核心&#xff0c;Task位于System.Threading.Tasks命名空间下。 创建任务的基本原理是使用线程池&#xff0c;也就是说任务最终也是要交给线程去执行的。但是微软优化了任务的线程池&#xff0c;使线程的控制更加精准和高效…

vue面试题:过滤器的作用,如何实现一个过滤器

过滤器的作用&#xff0c;如何实现一个过滤器 过滤器的作用&#xff1a;使用场景&#xff1a;如何实现&#xff1a; 过滤器的作用&#xff1a; 根据过滤器的名称&#xff0c;过滤器是用来过滤数据的&#xff0c;在Vue中使用filters来过滤数据&#xff0c;filters不会修改数据&…

kafka消费者接收不到消息

背景&#xff1a; 对kafka消息进行监听&#xff0c;生产者发了消息&#xff0c;但是消费端没有接到消息&#xff0c;监听代码 消费端&#xff0c;kafka配置 spring.kafka.bootstrap-serverskafka.cestc.dmp:9591 spring.kafka.properties.sasl.jaas.configorg.apache.kafka.…

Node.js最准确历史版本下载

先进入官网:Node.js https://nodejs.org/en 括号中LTS代表稳定版本. 嫌其他冗余博客帖子多&#xff0c;找起来费眼睛,可以到/release下载:Node.js,在blog后面加/release https://nodejs.org/en/blog/release/ 点击next翻页,跟上面同样的步骤