开发者学堂课程【高校精品课-华东师范大学 - Python 数据科学基础与实践:Pandas 数据分组 下】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1067/detail/15399
Pandas 数据分组 下
内容介绍:
一、Selecting a Column or Subset of Columns(选中一列,或列的子集)
二、Grouping with Dicts and Series(用 dicts 和 Series 进行分组)
三、Grouping with Functions(用函数进行分组)
四、Grouping by index levels(按索引层级来分组)
一、Selecting a Column or Subset of Columns(选中一列,或列的子集)
下面来学习分组,分组对于整个数据框分组完了以后,可以取里面的一列或是几列,本节主要是这个意思。
如果一个 GroupBy 对象是由 DataFrame 创建来的,那么通过列名或个包含列名的数组来对 GroupBy 对象进行索引的话,就相当于对列取子集做聚合(column subsetting for aggregation) .这句话的意思是:
df.groupby(‘key1’)【‘data1'】
df.groupby(‘key1' )【[‘data2']】
上面的代码其实就是下面的语法糖(Syntactic sugar)
df【‘data1'】.groupby(df【‘key1'】)
df【[‘data2']】.groupby(df【‘key1'】)
语法糖 Syntacticc sugar 是由 Peter J. Landin(和图灵一样的天才人物,是他最先发现了Lambda演算, 由此而创立了函数式程创造的一个词语,它意指那些没有给计算机语言添加新功能,而只是对人类来说更甜蜜的语法。语法糖往往给程序员提供了更实用的编码方式,有益于更好的编码风格,更易读。不过其并没有给语言添加什么新东西。
尤其是对于一些很大的数据集, 这种用法可以聚集一部分列。 例如,在处理一个数据集的时候,想要只计算data2列的平均值,并将结果返还为个DataFrame,我们可以这样写
先看数据,也就是数据框,先在下面做一下分组,这里是在整个数据框上做分组,然后它的key 是 key1和 key2。这里只允许显示其中的一份数据,也就是 data1以及 data2,然后再求其平均值,这就是取一列或取几列的含义。
那么得到需要的结果,也可以先得到一个分组对象,注意其后面没有做汇总,也没有做聚合。这是仅仅得到分组的 groupby 对象,然后在对象上需要求 data2的汇总。
注意这里情况没有显示,但是在下面的名字是 data2。所以这样的操作方式也可以,所以刚刚的内容意思是整个数据框分组以后,可以选其中的一列或几列。
二、Grouping with Dicts and Series(用 dicts 和 Series 进行分组)
下面可以用 dices 或者 series 进行分组,用字典和系列进行分组,
下来看这样的例子,这是五行五列的数据框,然后有列的名字、行的索引,运行使其显示数据,发现有列的名字:a、b、c、d、e,行的索引是这些名字(joe、steve、wes、jim、travis),然后可以用 iloc这是索引查找数据的。其中 i 表示用的是数字的,那么行是选2:3行(不包括第三行),那等于就是第2行,同时列是0,列是逗号就包括了这两列 b 和 c 等于把这两个数字变成空:np=nan,那么选择执行,再运行看到这两个数就变成了空,那么先看一下此数据。
然后假设有一个组,对应多个列,而且想要按照分组把这些列的和计算出来,然后看下面的例子:
Mapping={‘a’:‘red’,‘b’:‘red’,‘c’:‘blue’,‘d’:‘blue’,‘e’:‘red’,‘f’:‘orange’}
本来 a、b、c、d、e、f 是列,然后其对应了红、蓝、橙这样的分组,等于要把里面的列再按照颜色去分组,也就是说有一个分组,它的颜色会对应多个列,然后想用颜色把这些列统计、汇总出来。
开始操作:这部分讲是用字典和系列联合进行操作,那么可以在分组时,把字典传给 groupby 函数作为 key,所以在这个数据的框里面 groupby,刚刚做的字典,然后在列上进行操作,然后它就会用这个字典去映射列的名字。再把它分除,所以这个功能就强大了,在其上面进行汇总函数,最后就变成两种颜色,也就是上面数据中的A、B、C、D、E,变成了红色和蓝色,所以得到红色和蓝色的汇总,这种方法也可以适用于 series。刚开始在数据框上做操作,直接用 series 做也可以,构建 series,然后在groupby里面用 series,也一样可以得到两种颜色。
所以这样的技巧,就可以把列的名字还有有很多字段,就是有些数据
、分析项目里面几十个、几百个的字段。但是这些字段、列名它也可以分组,那么这里就不需要去改变式数据,直接可以用字典的方法来进行映射 market 操作,这个技巧大家要掌握一下。
三、Grouping with Functions(用函数进行分组)
然后学习用函数进行分组。比起用 dict 或 series 定义映射关系,使用 python 的函数是更通用的方法。任何一个作为 group key 的函数,在每一个 index value (索引值)上都会被调用一-次,函数计算的结果在返回的结果中会被用做 group name.更具体-点,考虑前一个部分的 DataFrame, 用人的名字作为素引值。假设我们想要按照名字的长度来分组;同时我们要计算字符串的长度,使用 len 函数会变得非常简单:
先看下面的实验,刚刚的数据 groupby 其中key 值为函数len派生的内置函数,然后再汇总求和,那么这个函数它会作用在哪里呢?这个函数其实是对索引,对行的名字进行操作。从前面的数据可以得知行的名字是人名。
前面一直做行名字的批注,那么所以 len 是作用在行的名字,所以需要测人名的长度,字母的长度,那么人名里面有三个字母、五个字母、六个字母的,但是列是不变的,所以这是汇总的结果。
这里可以执行显示 people,显示数据来看一下,发现人名 joe 是三个字母,wes 也是三个字母,jim 也是三个字母,所以意味着这些三个字母的就可以被分组到一起。
然后可以对照其数据是否对应,那么这里还有五个字母或是留个字母的,也就是字母长度为5或6。所以看一下此功能:可以用函数作用在索引上,然后可以混合不同的函数数组、字典、或者系列都可以。
接下里定一个列表。里面是为one、two的五个值。接下来做分组的复杂度提高了,key 有两个,一个是函数长度,测长度其作用在行的名字(index)上;另外一个是按照给的数据给的列表、数组得到下下面这样一个结果,结果里面是汇总是求最小值,那是作用在名字上面,名字的长度是3,5,6。
One,two 则是相相当于是在原来的数据左边加了一列,这里有五条记录,对应 one、one、one、two、two,然后再进行汇总,在群里面的最小值,可以去对照最小值数据。
四、Grouping by index levels(按索引层级来分组)
在分组的时候,可以来索引层级来分组。就是层次索引或者多索引,再复杂就是多索引问题的分组。接下来看这样的数据,构造一个列名,这个列名定义成多索引,从数组里面来得到的,它的名字有两个,一个 city,另一个是 tenor,上面是城市,下面是数值。这是在列上面,显示一下这是 multiindex 类型,然后下面来构建数据框,四行五列的数据列名字是刚刚定义的,它相当于是多索引。然后执行显示,行的索引是默认的0、1、2、3,列的名字是层级索引、多索引,其第零级是上面城市的名字,第一级是 tenor,这里可以进行对应。
然后进行分组,分组时可以通过使用 level 的关键字,Level=city的话,就会按照第零级的 city 去做分组来指明这是在列上面。
这里城市有两个,并且有五个值,但是最终它的分组只有两个组:Us和 JP,这是得到的这样结果。
这里给大家讲述了 pandas 的分组内容,这个分组可能比常规的分组要增加了很多新的内容,希望大家通过这个文件,能够加深对 pandas 分组理解,熟练掌握分组是做数据分析的一个基本的内容。