pandas分组计算平均值_数据处理进阶pandas入门(十五)

本文介绍pandas中的groupby()方法用于数据分组,包括单个和多个列的分组,以及如何提取分组结果,如get_group()和groups。通过实例展示了如何对DataFrame进行分组计算,例如计算平均值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回顾

在数据处理进阶pandas入门(十四)中,我们介绍了pandas中的去重与替换,需要掌握去重方法duplicates()方法和drop_duplicates()方法以及替换方法replace()的基本用法。今天我们讲一下pandas中分组的相关内容。

分组方法groupby()

在对数据进行处理的时候,我们常常会用到分组。pandas为我们提供了groupby()方法来进行分组。分组的具体过程如下:首先根据某些条件将数据拆分成组,然后对每个组独立应用函数方法进行相应的数据运算或处理,最后将结果合并到一个数据结构中。

pandas主要针对DataFrame进行分组操作。DataFrame可以在行(axis=0)或列(axis=1)上进行分组,将一个函数应用到各分组并生成一个新值,然后函数执行结果被合并到最终的结果对象中。下面我们看一下groupby()方法的基本用法。​

import numpy as npimport pandas as pddf = pd.DataFrame({'A':['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'], 'B':['c', 'c', 'd', 'e', 'b', 'b', 'a', 'c'], 'C':np.random.randn(8), 'D':np.random.randn(8)})print(df)print("---------------")# groupby()返回结果是一个groupby对象,是一个中间数据,没有进行计算print(df.groupby('A'))print("---------------")print(df.groupby('A').mean())

运行结果如下图所示。注意,groupby()方法的返回结果只是一个groupby对象,是一个中间数据,只有进行计算后的结果才会生成一个新的DataFrame。上述代码中对列A进行分组,A中共有a、b两个值,所以会被分成两组,进行求平均值计算,而列B是字符数据,所以会自动过滤,只对列C和列D进行分组后的计算。

fd4fb985960ebec0ea43ccd28e3ab685.png

groupby()基本用法

groupby()也支持多个参考分组,使用“[]”,基本用法如下。​

import numpy as npimport pandas as pddf = pd.DataFrame({'A':['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'], 'B':['c', 'c', 'd', 'e', 'b', 'b', 'a', 'c'], 'C':np.random.randn(8), 'D':np.random.randn(8)})print(df)print("---------------")print(df.groupby(['A', 'B']).mean())

上述代码中我们同时以“A”、“B”为参考进行分组,依次有“a c”、“b c”、“a d”、“b e”、“a b”、“b b”、“a a”、“a c”八个组合,分组后会将重复的组合合并计算,并自动进行排序。运行结果如下图所示。

c35c32bcea73fec4ce5119c3330742cf.png

多个参考分组

此外,我们还可以对分组后的结果进行指定序列计算。例如,我们以“A”为参考进行分组,然后只想得到对列“C”的运算结果,就可以使用groupby('A')['C']这样的方式实现。基本用法如下。​

import numpy as npimport pandas as pddf = pd.DataFrame({'A':['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'], 'B':['c', 'c', 'd', 'e', 'b', 'b', 'a', 'c'], 'C':np.random.randn(8), 'D':np.random.randn(8)})print(df)print("---------------")# 以A分组求C的平均值print(df.groupby('A')['C'].mean())print("---------------")print(df.groupby('A').mean())

运行结果如下图所示。当我们使用groupby('A')['C']时,只得到了列C的运算结果。

80b778eaedfd5f719b4c0707a46f42dd.png

指定分组操作

提取groupby分组

groupby()方法的返回结果虽然是一个groupby对象,但我们可以通过将它转换成列表得到一个可迭代的对象。​

import numpy as npimport pandas as pddf = pd.DataFrame({'A':['a', 'b', 'a', 'b'], 'B':[1, 2, 4, 3]})print(df)print("---------------")# 生成可迭代的元组列表listprint(list(df.groupby('A')))print("---------------")list_df = list(df.groupby('A'))print(list_df[0])print("---------------")# n是组名 df是分组后的DataFramefor n, df in list_df: print(n) print("#####") print(df) print("---------------")

我们将groupby对象转换成列表后进行遍历,可以看到,列表的每个元素都是一个元组,其中第一个元素是分组后的组名,第二个元素是分组后的DataFrame,运行结果如下图所示。

70aa2b5febf0a8f2d4e7c93c728b99a8.png

遍历groupby列表

通过上述的操作我们知道groupby对象其实是可迭代的,所以我们可以提取分组后的DataFrame。pandas中为我们提供了两个方法:get_group()和groups。

首先看一下get_group()方法,传入要提取的组名即可。基本用法如下。​

import numpy as npimport pandas as pddf = pd.DataFrame({'A':['a', 'b', 'a', 'b'], 'B':[1, 2, 4, 3]})print(df)print("---------------")list_df = df.groupby('A')print(list_df.size())print("---------------")print(list_df.get_group('a'))print("---------------")print(list_df.get_group('b'))

运行结果如下图所示。

f03242f787c447d801678fc8466e3b55.png

get_group()基本用法

groups是将分组后的groups转成字典,要注意的是,字典的value部分是原DataFrame的索引,即对应的分组组名所在的索引值。基本用法如下。​

import numpy as npimport pandas as pddf = pd.DataFrame({'A':['a', 'b', 'a', 'b'], 'B':[1, 2, 4, 3]})print(df)print("---------------")list_df = df.groupby('A')# 将分组后的groups转成字典print(list_df.groups)print("---------------")print(list_df.groups['a'])

运行结果如下图所示。

abf9242f95dad3bc836cb3ba79816bd8.png

groups提取

对于多个参考分组后的groupby对象,get_group()方法与groups同样适用,用法也基本一致。​

import numpy as npimport pandas as pddf = pd.DataFrame({'A':['a', 'b', 'a', 'b', 'a', 'b', 'a', 'a'], 'B':['c', 'c', 'd', 'e', 'b', 'b', 'a', 'c'], 'C':np.random.randn(8), 'D':np.random.randn(8)})print(df)print("---------------")list_df = df.groupby(['A', 'B'])print(list_df.groups)print("---------------")print(list_df.get_group(('a', 'c')))

运行结果如下图所示。

4226131a19146d439cf785e424b7c021.png

多个参考分组提取

总结

以上内容介绍了pandas中分组的相关知识,重点掌握groupby()方法的基本概念与用法,以及对分组的提取方法get_group()和groups的用法与差别。感谢大家的支持与关注,欢迎批评指正,一起讨论~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值