文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么使用python中分组函数groupby和分组运算函数agg

2023-06-25 11:41

关注

这篇文章主要介绍“怎么使用python中分组函数groupby和分组运算函数agg”,在日常操作中,相信很多人在怎么使用python中分组函数groupby和分组运算函数agg问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用python中分组函数groupby和分组运算函数agg”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

groupby:

首先创建数据:

import pandas as pdimport numpy as npdf = pd.DataFrame({'A': ['a', 'b', 'a', 'c', 'a', 'c', 'b', 'c'],                        'B': [2, 7, 1, 3, 3, 2, 4, 8],                        'C': [100, 87, 96, 130, 105, 87, 96, 155]})dfOut[2]:    A  B    C0  a  2  1001  b  7   872  a  1   963  c  3  1304  a  3  1055  c  2   876  b  4   96

pandas中groupby的基本操作:

按A列进行分组,求B、C两列的均值:

df.groupby('A').mean()Out[6]:           B           CA                      a  2.000000  100.333333b  5.500000   91.500000c  4.333333  124.000000

当然也可以按照多列进行分组,获取其他列的均值:

df.groupby(['A','B']).mean()Out[7]:        CA B     a 1   96  2  100  3  105b 4   96  7   87c 2   87  3  130  8  155

分组后,选择列进行计算:

data=df.groupby('A')data['B'].std()Out[11]: Aa    1.00000b    2.12132c    3.21455Name: B, dtype: float64 #选择B、C两列data['B','C'].mean()Out[12]:           B           CA                      a  2.000000  100.333333b  5.500000   91.500000c  4.333333  124.000000

按A进行分组后,可以对不同的列采用不同的聚合方法(ps:这一点就和hive很相像了)

data.agg({'B':'mean','C':'sum'})    #B列均值,C列汇总Out[14]:      C         BA               a  301  2.000000b  183  5.500000c  372  4.333333

如果按照A进行分组后,对多列采用相同的聚合方法,我们可以借助apply函数:

df.groupby('A').apply(np.mean)Out[25]:           B           CA                      a  2.000000  100.333333b  5.500000   91.500000c  4.333333  124.000000

将某列数据按数据值分成不同范围段进行分组运算

创建数据集:

np.random.seed(0)df = pd.DataFrame({'Age': np.random.randint(20, 70, 100),                         'Sex': np.random.choice(['Male', 'Female'], 100),                         'number_of_foo': np.random.randint(1, 20, 100)})Out[38]:    Age     Sex  number_of_foo0   64  Female             141   67  Female             142   20  Female             123   23    Male             174   23  Female             15

目标:将age字段分成三组,有如下两种方法实现:

#第一种方法:1、bins=4pd.cut(df['Age'], bins=4)0       (56.75, 69.0]1       (56.75, 69.0]2     (19.951, 32.25]3     (19.951, 32.25]4     (19.951, 32.25]... #第二种方法2、bins=[19, 40, 65, np.inf]pd.cut(df['Age'], bins=[19,40,65,np.inf])Out[40]: 0     (40.0, 65.0]1      (65.0, inf]2     (19.0, 40.0]3     (19.0, 40.0]4     (19.0, 40.0] #分组范围结果如下:age_groups = pd.cut(df['Age'], bins=[19,40,65,np.inf])df.groupby(age_groups).mean()Out[43]:                     Age  number_of_fooAge                                   (19.0, 40.0]  29.840000       9.880000(40.0, 65.0]  52.833333       9.452381(65.0, inf]   67.375000       9.250000 #按‘Age'分组范围和性别(sex)进行制作交叉表 pd.crosstab(age_groups, df['Sex'])Out[44]: Sex           Female  MaleAge                       (19.0, 40.0]      22    28(40.0, 65.0]      18    24(65.0, inf]        3     5

agg:

使用groupby按照某列(A)进行分组后,需要对另外一列采用不同的聚合方法:

df.groupby('A')['B'].agg({'mean':np.mean, 'std': np.std}) Out[16]:        std      meanA                   a  1.00000  2.000000b  2.12132  5.500000c  3.21455  4.333333

按照某列进行分组后,对不同的列采用不同的聚合方法:

df.groupby('A').agg({'B':[np.mean,'sum'],'C':['count',np.std]})  #[]中对应的是两种方法 Out[17]:       C                    B      count        std      mean sumA                               a     3   4.509250  2.000000   6b     2   6.363961  5.500000  11c     3  34.394767  4.333333  13

transform:

前面两种方法得到的结果是以A列值为索引的结果,如果使用没有进行groupby分组的index的话,该怎么操作呢?此时就要用到transform函数了。transform(func, args, *kwargs) 方法简化了这个过程,: func 参数应用到所有分组,然后把结果放置到原数组的 index 上:

dfOut[31]:    A  B    C0  a  2  1001  b  7   872  a  1   963  c  3  1304  a  3  1055  c  2   876  b  4   967  c  8  155 df.groupby('A')['B','C'].transform('count')  #注:count函数在计算时,不计算nan值Out[32]:    B  C0  3  31  2  22  3  33  3  34  3  35  3  36  2  27  3  3

从中可以看出:按A列进行分组,对B、C两列进行计数时,B为a的索引有[0,2,4],所以结果列的中[0,2,4]索引的值都为3,相当于广播了。对于C列,同理。

到此,关于“怎么使用python中分组函数groupby和分组运算函数agg”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯