热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【Python】GroupBy:数据聚合与分组运算

【博客地址】:https:blog.csdn.netsunyaowu315【博客大纲地址】:https:blog.csdn.netsunyaowu315articledetails

【博客地址】:https://blog.csdn.net/sunyaowu315
【博客大纲地址】:https://blog.csdn.net/sunyaowu315/article/details/82905347

python:GroupBy:数据聚合与分组运算

目录:

文章目录

    • 目录: @[toc]
      • 一 GroupBy技术
        • 1 对分组进行迭代
        • 2 选取一个或一组列
        • 3 通过字典或Series进行分组
        • 4 通过函数进行分组
        • 5 根据索引级别进行分组
      • 二 数据聚合
        • 1 面向列的多函数应用
        • 2 以“无索引”形式返回聚合数据
      • 三 分组级运算和转换
        • 1 apply:一般性的“拆分-应用-合并”
        • 2 分位数和桶分析
          • 1)示例:用特定分组的值填充缺失值
          • 2)示例:随机采样和排列
          • 3)示例:分组加权平均数和相关系数
          • 4)示例:面向分组的线性回归
      • 四 透视表和交叉表
        • 1 透视表
        • 2 交叉表
      • 五 END
  • 对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),这是数据分析工作中的重要环节。在将数据集准备好之后,通常的任务就是计算分组统计或生成透视表。pandas提供了一个灵活的groupby功能,它能够以一种自然的方式对数据集进行切片、切块、摘要等操作。
  • 关系型数据库和SQL能够流行的原因之一就是能够方便地对数据进行连接、过滤、转换和聚合等。
  • python和pandas强大的能力,有助于执行更复杂的分组运算,如:
    • 根据一个或多个键(可以是函数、数组或DataFrame列名)拆分pandas对象
    • 计算分组摘要统计,如计数、平均值、标准差或用户自定义函数
    • 对DataFrame的列应用各种各样的函数
    • 应用组内转换或其他函数,如规格化、线性回归、排名或选取子集等
    • 计算透视表或交叉表等
    • 执行分位数分析以及其他分组分析

一 GroupBy技术

  • split-apply-combine(拆分-应用-合并),基本描述了groupby的整个过程。分组运算的第一个阶段,pandas对象中的数据会根据提供的键被拆分为多组,拆分操作是在对象的特定轴上执行的;然后将一个函数应用在各个分组并产生一个新值;最后,所有这些函数的执行结果会被合并到最终的结果对象中。
  • 分组键可以有多种形式,且类型不必相同:
    • 列表或数组,其长度与待分组的轴一样
    • 表示DataFrame某个列名的值
    • 字典或Series,给出待分组轴上的值与分组名之间的对应关系
    • 函数,用于处理轴索引或索引中的各个标签
  • 分组产生的变量grouped是一个GroupBy对象,实际上还没有进行任何计算,只是含有一些有关分组键的中间数据。换句话说,该对象已经有了接下来对各分组执行运算所需的一切信息。数据Series根据分组键进行了聚合,产生了一个新的Series
  • 如果通过两个键对数据进行分组,得到的Series具有一个层次化索引
  • 分组键可以为Series,也可以是任意长度的数组,还可以是列名
  • 分组过程中的“麻烦列”会在结果中被踢出。默认情况下,所有数值列都会被聚合,虽然有时可能会被过滤为一个子集。
  • 无论准备拿groupby干啥,都可能会用到groupby的size方法,它可以返回一个含有分组大小的Series

1 对分组进行迭代

  • GroupBy对象支持迭代,可以产生一组二元元组(由分组名和数据块组成)

for name,group in df.groupby(key1)
print(name)
print(group)

  • 对于多重键的情况,元组的第一个元素将会是由键值组成的元组

for (k1,k2) ,group in df.groupby(['key1','key2'])
print(k1,k2)
print(group)

  • 也可以对这些数据片段进行任何操作,例如:将这些数据片段做成一个字典:

pieces = dict(list(df.groupby('key1')))
peices['b']

  • groupby默认是在axis = 0上进行分组的,也可以设置在其他任何轴上进行分组

2 选取一个或一组列

  • 对于由DataFrame产生的groupby对象,如果用一个或一组列名对其进行索引,就能实现选取部分列进行聚合的目的。尤其对于大数据集,很可能只需要对部分列进行聚合。

df.groupby(['key1','key2'])[['data2']].mean()

3 通过字典或Series进行分组

  • 通过字典分组只需要将这个字典传给groupby即可

people = DataFrame(np.random.randn(5,5),columns = ['a','b','c','d','e'],idnex = ['joe','steve','wes','jim','travis'])
people.ix[2:3,['b','c']] = np.nan #添加几个缺失值
mapping = {'a':'red','b':'red','c':'blue','d':'blue','e':'red','f':'orange'}
by_column = people.groupby(mapping,axis = 1)

  • Series也有同样的功能,它可以被看做一个固定大小的映射,pandas会检查Series以确保其索引跟分组轴是对齐的。

4 通过函数进行分组

  • 相较于字典或Series,python函数在定义分组映射关系时可以更有创意且更为抽象。任何被当做分组键的函数都会在各个索引值上被调用一次,其返回值就会被用作分组名称。
  • 将函数跟数组、列表、字典、Series混合使用也可以,因为任何东西最终会被转换为数组。

5 根据索引级别进行分组

  • 层次化索引数据集最方便的地方就在于它能够根据索引级别进行聚合。要实现该目的,通过leve关键字传入级别编号或名称即可。

columns = pd.MultiIndex.form_arrays([['US','US','US','JP','JP'],[1,3,5,1,3]],names = ['cty','tenor'])
hier_df = DataFrame(np.random.randn(4,5),columns = columns)
hier_df.groupby(level = 'cyt',axis = 1).count

二 数据聚合

  • 对于聚合,指的是任何能够从数组产生标量值的数据转换过程。许多常见的诸如mean、sum、count、min等聚合运算都有就地计算数据集统计信息的优化实现。然后,并不只能使用这些方法,可以使用自己发明的聚合运算,还可以调用分组对象上已经定义好的任何方法。
  • 如果要使用自己定义的聚合函数,只需将其传入aggregate或agg方法即可
  • 经过优化的groupby方法:
    • count # 分组中非NA值得数量
    • sum # 非NA值的和
    • mean # 非NA值的平均数
    • median # 非NA值的算术中位数
    • std、var # 无偏标准差和方差
    • min、max # 非NA值的最小值和最大值
    • prod # 非NA值的积
    • first、last # 第一个和最后一个非NA值
  • 有些方法也可以用在这里,但严格来讲,它们并非聚合运算。

1 面向列的多函数应用

  • 对Series或DataFrame列的聚合运算其实就是使用aggregate(使用自定义函数)或调用诸如mean、std之类的方法。然后,可以对不同的列使用不同的聚合函数,或一次应用多个函数。
  • 如果传入一组函数或函数名,得到的DataFrame的列就会以相应的函数命名
  • 并非一定要接受groupby给出的列名,特别是lambda函数,辨识度很低。如果传入的是一个由(name,function)元组组成的列表,则各元组的第一个元素就会被用作DataFrame的列名(可以将二元元组看做一个有序映射)。
  • 对于DataFrame,还可以定义一个应用于全部列的函数,或不同的列应用不同的函数。如果DataFrame拥有层次化的列,相当于分别对各列进行聚合,然后用concat将结果组合在一起(列名用作keys参数)。
  • 想要对不同的列应用不同的函数,具体的方法是向agg传入一个列名映射到函数的字典。

2 以“无索引”形式返回聚合数据

  • 可以向groupby传入as_index = False以禁用由分组键组成的索引这一功能。对结果调用reset_index也能得到这种形式的结果。

三 分组级运算和转换

  • 聚合只不过是分组运算的其中一种而已。它是数据转换的一个 特例,也就是说,它接受能够将一维数组简化为标量值的函数。
  • transform和apply方法,能够执行更多其他的分组运算。

1 apply:一般性的“拆分-应用-合并”

  • 跟aggregate一样,transform也是一个有着严格条件的特殊函数:传入的函数只能产生两种结果,要么产生一个可以广播的标量值,要么产生一个相同大小的结果数组。最一般化的groupby方法是apply,apply会将待处理的对象拆分成多个片段,然后对各片段调用传入的函数,最后尝试将各片段组合到一起。
  • 如果传给apply的函数能够接受其他参数或关键字,则可以将这些内容放在函数名后面一并传入。

tips.groupby(['smoker','day']).apply(top,n = 1,column = 'tptal_bill')

  • 除一些基本用法外,能否充分发挥apply的威力很大程度上取决于你的创造力。传入的那个函数能做什么全由你说了算,它只需要返回一个pandas对象或标量值即可。

result = tips.groupby('smoker')['tip_pit'].describe()

  • 禁止分组键

2 分位数和桶分析

  • pandas有一些能够根据指定面元或样本分位数将数据拆分成多块的工具(比如cut或qcut)。将这些函数跟groupby结合起来,就能非常轻松地实现对数据集的桶(bucket)或分位数(quantile)分析
1)示例:用特定分组的值填充缺失值
2)示例:随机采样和排列
3)示例:分组加权平均数和相关系数
4)示例:面向分组的线性回归

四 透视表和交叉表

1 透视表

  • 透视表(pivot_table)是各种电子表格 程序和其他数据分析软件中一种常见的数据汇总工具。它根据一个或多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个矩形区域中。在python和pandas中,可以通过groupby功能以及层次化索引的重塑运算制作透视表。DataFrame有一个pivot_table方法,此外还有一个顶级的pandas.pivot_table函数。除能为groupby提供便利外,pivot_table还可以添加分项小计。
  • pivot_table的参数
    • ① values # 待聚合的列的名称,默认聚合所有数值列
    • ② rows # 用于分组的列名和其他分组键,出现在结果透视表的行
    • ③ cols # 用于分组的列名或其他分组键,出现在结果透视表的列
    • ④ aggfunc # 聚合函数或函数列表,默认为mean,可以是任何对groupby有效的函数
    • ⑤ fill_value # 用于替换结果表中的缺失值
    • ⑥ margins # 添加行、列小计和总计,默认为False

tips.pivot_table('tip_pct',rows = ['sex','smoker'],cols = 'day',aggfunc = len,margins = True)

2 交叉表

  • 交叉表(crosstab)是一种用于计算分组频率的特殊透视表
  • 假设我们想要根据某两个特征对数据进行汇统计汇总,虽然pivot_table可以实现该功能,但pandas.crosstab函数会更加方便。

五 END


推荐阅读
  • Explain如何助力SQL语句的优化及其分析方法
    本文介绍了Explain如何助力SQL语句的优化以及分析方法。Explain是一个数据库SQL语句的模拟器,通过对SQL语句的模拟返回一个性能分析表,从而帮助工程师了解程序运行缓慢的原因。文章还介绍了Explain运行方法以及如何分析Explain表格中各个字段的含义。MySQL 5.5开始支持Explain功能,但仅限于select语句,而MySQL 5.7逐渐支持对update、delete和insert语句的模拟和分析。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 这是一个愚蠢的问题,但我只是对此感到好奇.假设我在Pythonshell,我有一些我查询的数据库对象.我做:db.query(的queryString)该查询在0xffdf842c ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
author-avatar
淡定神仙2502891317
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有