collector list 多个分组_【S01E07】groupby方法、GroupBy对象、groupby方法的分组键

3685dcdd47b465fd2edd238a91b8afe7.png

Hadley Wickham(许多热门R语言包的作者)创造了一个用于表示分组运算的术语"split-apply-combine"(拆分-应用-合并),这个词很好的描述了整个过程。分组运算的第一个阶段,pandas对象(无论是Series、DataFrame还是其他的)中的数据会根据你所提供的一个或多个键被拆分(split)为多组。拆分操作是在对象的特定轴上执行的。例如,DataFrame可以在其行(axis=0)或列(axis=1)上进行分组。然后,将一个函数应用(apply)到各个分组并产生一个新值。最后,所有这些函数的执行结果会被合并(combine)到最终的结果对象中去。

PART I. groupby方法PART II.  GroupBy对象i)  GroupBy对象ii) 对/GroupBy对象进行迭代和转化iii)GroupBy对象的常用方法PART II. groupby方法的分组键i)   列名作为分组键df.groupby('key1').mean()df.groupby(['key1','key2']).mean()ii)  列表作为分组键df.groupby(l)['size'].count()iii) 数组作为分组键df.groupby([states,year])['data1'].mean()iv)  字典作为分组键df.groupby(mapping, axis=1).sum()v)   Series作为分组键people.groupby(map_series, axis=1).count()df.groupby([df['key1'],df['key2']]).mean()vi)  索引作为分组键df.groupby(level='cty',axis=1).count()df.groupby(level=0,axis=1).count()vii) dtype作为分组键df.groupby(df.dtypes,axis=1).size()viii)函数作为分组键people.groupby(len).sum()df.groupby(lambda x: x.day)['volume'].sum()ix)  函数跟数组、列表、字典、Series混合使用作为分组键people.groupby([len,key_list]).sum()

PART I . groupby方法

groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=False, observed=False, **kwargs)by : mapping, function, label, or list of labelsUsed to determine the groups for the groupby.If ``by`` is a function, it's called on each value of the object'sindex. If a dict or Series is passed, the Series or dict VALUESwill be used to determine the groups (the Series' values are firstaligned; see ``.align()`` method). If an ndarray is passed, thevalues are used as-is determine the groups. A label or list oflabels may be passed to group by the columns in ``self``. Noticethat a tuple is interpreted a (single) key.axis : {0 or 'index', 1 or 'columns'}, default 0Split along rows (0) or columns (1).level : int, level name, or sequence of such, default NoneIf the axis is a MultiIndex (hierarchical), group by a particularlevel or levels.as_index : bool, default TrueFor aggregated output, return object with group labels as theindex. Only relevant for DataFrame input. as_index=False iseffectively "SQL-style" grouped output.sort : bool, default TrueSort group keys. Get better performance by turning this off.Note this does not influence the order of observations within eachgroup. Groupby preserves the order of rows within each group.group_keys : bool, default TrueWhen calling apply, add group keys to index to identify pieces.squeeze : bool, default FalseReduce the dimensionality of the return type if possible,otherwise return a consistent type.observed : bool, default FalseThis only applies if any of the groupers are Categoricals.If True: only show observed values for categorical groupers.If False: show all values for categorical groupers.重点参数:by axis level as_index 

3745780941c3bee7ce037844aef16d1a.png

PART II. GroupBy对象

fa3fb336336589b6b0ba29db96c9dd67.png

i)GroupBy对象

假设想要按key1进行分组,并计算data1列的平均值。实现该功能的方式有很多,而这里要用的是:访问data1,并根据key1调用groupby:

2ea276fe366eefca2f6163cf6395bae5.png

变量grouped是一个SeriesGroupBy对象, 变量grouped2是一个DataFrameGroupBy对象。它们实际上还没有进行任何计算,只是含有一些有关分组键'key1'的中间数据。换言之,该对象已经有了接下来对各分组执行运算所需的信息。

ii)对/GroupBy对象进行迭代和转化

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

分组键为单列

fb44377baf6c4c2c463fba0d2e5d4c51.png

f05a17e4d1aaee6444cb7b9bd3b001c5.png

6cb957a09a2658362be2f067908bc367.png

分组键为多列

fb44377baf6c4c2c463fba0d2e5d4c51.png

858566ac4e2720f95898910639d2c86a.png

ed45285bce2ec950863dddaac685e8f6.png

通过列表生成式或list()方法可以把groupby对象,转换为分组名+数据块组成的元组的列表,其实我们还可以把groupby对象转换为字典

86771b8ac13780ec523f48ce33271d87.png

iii)GroupBy对象的常用方法

GroupBy对象的常用方法除了常见的sum、mean、count等优化好的聚合函数,还有返回不同分组大小的Series的简便方法size(),除此之外还可以对groupby对象传入自定义的函数(agg/apply)。这部分的内容将放在下面一篇详细展开。

例如,我们可以调用GroupBy的mean和count方法来计算分组平均值和分组计数:

391f623a42b092b5bd9c15a2b0cfd8bb.png

groupby对象的size方法

groupby对象的size方法可以返回一个含有分组大小的Series

bcc39735dd4345dafd2a4153724d86a9.png

对groupby对象调用count不行吗?倒也不是不行,就是格式不太友好。

9519ef0f0c5689db66e0ea7757629239.png

所以还是size方法好

PART III. groupby方法的分组键

分组键的形式:

  • 列表或数组,其长度与待分组的轴一样
  • 表示DataFrame某个列名的值
  • 字典或Series,给出待分组轴上的值与分组名之间的对应关系
  • 函数,用于处理轴索引或索引中的各个标签

列表/数组、列名、字典、Series、函数

注意,后面三种都只是快捷方式,最终目的都是产生一组用于拆分对象的值,而且任何东西最终都会被转换为数组。

i)列名作为分组键

可以用【一个列名字符串或一个列名字符串的列表】选取部分列进行聚合

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

df.groupby('key1')['data1']       等价于    df['data1'].groupby(df['key1'])
df.groupby('key1')[['data2']]     等价于    df[['data2']].groupby(df['key1')]

e3053440058a353a9befd0a53a38c0ca.png

de53cdbefbbb2e3046d8975a7166ad95.png

908b3cd8dc7253e868cbac25d4590712.png

在执行df.groupby('key1').mean()时,结果中没有key2列。这是因为df['key2']不是数值数据(俗称“麻烦列”),所以被从结果中排除了。默认情况下,所有数值列都会被聚合,虽然有时候可能会被过滤为一个子集。

聚合单列并以DataFrame形式得到结果

60c18294a165825faaf22ffcd2bcff80.png

a57c5995d230ee40cf5d247fa6d05e82.png

聚合单列并以Series形式得到结果

3ed73069a032a54e493adf112060eb97.png

f76547475f831f40b4dc4fbd4f977972.png

ii)列表作为分组键

7d4f4d2ed42d4c21a54a3e2230e3bf36.png

iii)数组作为分组键

6207906913d69084475609f902d859f6.png

b1941c5e0040efbaaab3a41550fff180.png

iv)字典作为分组键

34845cf76b60da642a0bcf2484e9f06e.png

列的分组关系如下:

25b2f7b7ae59d6ee9fb28384bfbc1a30.png

只需把这个包含分组关系的字典传给groupby即可:

81ecfc5880424739462a41ea8a2a8a75.png

v)Series作为分组键

Series也有字典同样的功能,它可以被看作一个固定大小的映射。对于上面那个例子,如果用Series作为分组键,则pandas会检查Series以确保其索引跟分组轴是对齐的

c3c1ff605bbf4b6816b8ca957cedaf47.png

多个Series作为分组键

500d88ea05c3344703a65af751ebae74.png

.mean()的调用过程先略去不讲。这里最重要的是,数据(Series)根据分组键进行了聚合,产生了一个新的Series,其索引为唯一值。之所以结果中索引的名称为key1、key2,是因为原始DataFrame的列df['key1']、df['key2']就叫这个名字。

通过对两个键进行分组,得到的Series具有一个层次化索引(由唯一的键值对组成),reshape一下:

7f7e8609a611b60a01f909ebfa83d47a.png

vi)索引作为分组键

向level关键字传入级别编号或名称,根据索引级别分组

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

88cd5b85f657e7ee8df78d46735a8a55.png

21da9170962fa2b36b5f76342349e5d9.png

66de9ca659873107877384946b1e20fd.png

vii)dtype作为分组键

在axis=1上根据dtype对列进行分组

0736469b6d0ce54fbef08a656dfc7d91.png

viii)函数作为分组键

相较于字典或Series,Python函数在定义分组映射关系时可以更有创意且更为抽象。任何被当作分组键的函数都会在各个索引值上被调用一次,其返回值就会被用作分组名称。( If ``by`` is a function, it's called on each value of the object's index.)

a10103773bd5ac2566b2dfb06f450005.png

假设我们现在想根据人名的长度进行分组:

60c3d7b977df8de02b6dfa774ae31afd.png

函数作为分组键很灵活,下面是12月1日1分钟K线的数据,求这一天的总成交量,除了用df['volume'].sum(),还可以用将lambda函数作为分组键进行聚合的方法实现

d53f2f4479303e9ebccbc4cc1742bdc7.png
>>>path = r"C:UsersbyqpzDesktop现货策略现货高频新策略12.01.csv"
>>>df = pd.read_csv(path, engine='python',encoding='utf_8_sig',index_col='time',parse_dates=True)
>>>df['volume'].sum()
119939049.16099769
>>>df.groupby(lambda x: x.day)['volume'].sum()
1    1.199390e+08
Name: volume, dtype: float64

ix)函数跟数组、列表、字典、Series混合使用作为分组键

混合使用不是问题,因为任何东西最终都会被转换为数组:

dfd55aa0ec2388c2b86b57cef5c685ba.png

3d47810bcdd265d5c6a71ae20b235318.png

09fe0a57a06f6ac36e5d83d30224daaf.png

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

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

相关文章

清理垃圾代码bat_来买个小内存u盘么咯?盘内带电脑垃圾清理.bat那种丨heibai.org...

在某宝个别店铺购买了小内存u盘到货后插入电脑,发现自带了一个名为电脑垃圾清理的小程序。对就是这货怀揣着这家店真好,还带了垃圾清理软件的想法,我试着运行了软件.但是好像没有卵用.正好小表弟好像对这个比较了解,我去问问他咋回…

射灯安装方法图解_家居射灯怎么选?第三代宜美SMD射灯给你正解

前段时间,刚把自己的房子完成硬装,在灯具选择的过程中,家人的意见就不太统一。其父母觉得选灯只要够亮就行,而媳妇觉得选灯选贵的才行。到底谁的选灯方法好呢?其实家人们的建议并不是完全不对,灯够亮只是其…

c标签判断true false jsp_北京尚学堂卓越班252天[第042天]——Jsp

1. JSP的核心运行原理1) 客户端浏览器发送请求到服务器,访问a.jsp文件。http://localhost:8989/应用名/a.jsp2) 服务器端接收到请求后所做的处理a) 创建request和response两个对象b) 根据请求中的应用名找到该应用下面的web.xml文件,发现该应用的配置文件…

js aes加密_某高考咨询网js逆向分析笔记

一、某高考资讯网逆向分析某网站的js加密分析,安全签名signsafe HmacSHA1 AES一年前分析过网站数据还没有加密,最近需要获取新的数据发现原先的爬虫失效,请求和响应都经过加密。于是重新分析,记录下分析思路以及分析过程中遇到的…

opencv 的norm_22、OpenCV用卷积Filter2D进行滤波器

迄今为止,看到的函数中,卷积的操作发生在OpenCV函数的内部。理论上,图像卷积就是将内核与图像覆盖区域对应位置相乘之后求和。从调用函数上来看,它需要一个数组参数来描述内核。在实践层面,有一个重要的微妙因素会对结…

glide加载gif图不显示动画_用Python绘制会动的柱形竞赛图

我们经常看到的Bar Chart Race(柱形竞赛图),可以看到数据的呈现非常的直观。今天就一起来学习下如何生成和上面一样的柱形竞赛图。1、导入Python库2、加载数据集这里使用的是城市人口数据集,加载我们想要的数据:其中&a…

不冲突的端口范围_网络中IP地址发生冲突故障怎么办

——————欢迎新老朋友们加入微信群,方便技术讨论,信息互通,行业交流:智能弱电行业专家群;智能弱电行业技术群;智能弱电行业信息群;申请加入请加小编微信:15537112161———————有朋友提…

项目结构_组织结构对项目影响系列课程---项目式组织结构

在前面的几篇文章中我们分别介绍了,系统型(简单型),职能型,弱矩阵,平衡矩阵,强矩阵结构的优点和缺点及它们带给项目的影响。今天我们介绍项目式组织结构的优点和缺点及其可能产生的影响。从结构…

第三范式的作用_钟启泉:教学范式的转型,让一线教师面临三大挑战 | 头条

培育“核心素养”的方法论——能动学习真实性的学习境脉所谓“能动学习”是“基于学习者的主体性参与与学习者之间能动的交互作用的学习而产生的”。它不是单纯记忆知识的学习,而是指学习者能够活跃地应对种种课题,并富有实感支撑的学习。基于“核心素养…

云服务器 管理控制台_关于小白如何初步管理自己的云服务器

博主在刚刚接触云服务器的时候,买的云服务是Linux系统的,反正是一脸懵,后来找了很多资料。所以博主认为步骤主要为以下几步第一步:如果买的是Linux系统将其重装成windows系统。以腾讯云服务器为例1.点击右上角的控制台2.进入买的云…

leetcode 贪心_利用贪心算法解LeetCode第1253题:重构2行二进制矩阵

题目描述给你一个 2 行 n 列的二进制数组:矩阵是一个二进制矩阵,这意味着矩阵中的每个元素不是 0 就是 1。第 0 行的元素之和为 upper。第 1 行的元素之和为 lower。第 i 列(从 0 开始编号)的元素之和为 colsum[i],col…

pgadmin连接服务器失败_增值税发票税控软件:连接服务器失败是否使用离线文件进行更新?...

增值税发票税控软件:连接服务器失败是否使用离线文件进行更新?第一步:确认本地电脑是否可以正常打开网页;打开电脑,网页查看一下是否可以正常上网,打开百度发现,可以正常上网。第二步&#xff1…

移除镜像_这是否是你心目中的英雄联盟手游?镜像地图。水晶塔,传送移除

自从5月29日之后,RIOT官方放出了英雄联盟手游最新开发者日志后。关于视频内展示的多个游戏关键内容。在玩家群体中引起了大量的争议和讨论。以下是争议和讨论最多的内容1.游戏内英雄的攻击是否为AOE伤害?在大多数的玩家心中,英雄联盟手游是不应该有这种…

电脑重启bootmgr_电脑出现bootmgr is missing怎么办

展开全部电脑开机,或者重启以后显示:Bootmgr is missing, 是代表硬盘的主引导记录(MBR)出错,从而导致无法引e68a8462616964757a686964616f31333337613931导系统,哪只能重建主引导记录,还有一个可能是丢失系统文件&…

qt 在label上以光标位置进行缩放_缩放|位移|渐变简单动画

本文简单介绍Qt的一些动画效果(缩放,位移,渐变)。缩放动画将窗口的geometry(位置,大小)属性作为动画参考实现缩放动画。代码QWidget *w new QWidget;w->setWindowTitle(QStringLiteral("缩放动画Qt君"));w->resize(320, 240)…

虚拟机中ubuntu可以使用显卡吗_在KVM下使用ubuntu19.10安装Anbox

导言:Anbox是一个Android模拟器,可以从linux系统运行Android应用程序或游戏。对于Anbox的安装已经有了各种教程,主要针对ubuntu18.04之前的版本。最近在做一个关于虚拟机中跑安卓的项目,因此在虚拟机中使用ubuntu18.04系统&#x…

mysql tree_MySQL树形遍历(二)

转载自:http://blog.csdn.net/dreamer0924/article/details/7580278英文原文:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/预排序遍历树算法:modified preorder tree traversal algorithm这个算法有如下几个数据结构1 lft 代表左 left2 r…

mysql 常用数据库连接池_常见的数据库连接池

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入 2.C3P0 在Hibernate和Spring中默认支持该数据库连接池 需要引入:c3p0-0.9.1.2.jar包,如果报错再引入mchange-commons-0.2.jar 1. 在类路径下编写一个c3p0-config.xml文件 c3p0-co…

win32_bios 的对象编辑器无法保存对象_怎样创建Femap对象

创建Femap对象主要有两种方式,一是直接在Femap内置的API程序窗体中创建,二是在API程序窗口以外的开发环境中创建。一、使用FEMAP集成的API程序窗口开始使用FEMAP API的最快方法是打开API编程窗口。它提供了一个完整的编辑、调试和运行的环境,…

未定义变量: data_三、变量声明

三、变量声明var声明主要特点: - var是函数作用域,只针对函数声明 - 可以多次声明同一个变量不会报错 - 捕获变量怪异之处function fnVar(flag: boolean) {if(flag) {var x 10;}return x; } fnVar(true); // 10 fnVar(false); // undefinedvar isDone: …