Python数据分析与应用-从数据获取到可视化(第2版)课件 第5章 数据聚合与分组运算_第1页
Python数据分析与应用-从数据获取到可视化(第2版)课件 第5章 数据聚合与分组运算_第2页
Python数据分析与应用-从数据获取到可视化(第2版)课件 第5章 数据聚合与分组运算_第3页
Python数据分析与应用-从数据获取到可视化(第2版)课件 第5章 数据聚合与分组运算_第4页
Python数据分析与应用-从数据获取到可视化(第2版)课件 第5章 数据聚合与分组运算_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章数据聚合与分组运算《Python数据分析与应用:从数据获取到可视化(第2版)》学习目标/Target

了解分组与聚合的原理,能够说出分组与聚合的原理

掌握分组方法的使用,能够通过groupby()方法按不同标准对数据进行分组

掌握分组信息的查看方式,能够通过多种方式查看分组的信息

熟悉内置统计方法的使用,能够通过统计方法聚合数据学习目标/Target

掌握agg()方法的使用,能够通过agg()方法聚合数据

掌握transform()方法的使用,能够通过transform()方法转换数据

掌握apply()方法的使用,能够通过apply()方法聚合数据章节概述/Summary在进行数据分析工作时,我们可能会遇到这样的场景:现在要求从日志数据中找出每天访问次数最多的IP,这时需要先把所有的日志数据按天拆分成每天的日志数据,再对每天的日志数据进行统计运算,最后把所有的统计结果放到一起,这样便完成了最初设定的要求,这个过程中用到的思想就是分组与聚合——数据重组后再合并。pandas中提供了一些用于分组与聚合的方法,另外还提供一些其他的分组级运算,本章将针对这些内容进行详细地讲解。目录/Contents01分组与聚合的原理02分组操作03数据聚合04分组级运算05案例:篮球运动员信息分析分组与聚合的原理5.15.1

分组与聚合的原理了解分组与聚合的原理,能够说出分组与聚合的原理学习目标5.1

分组与聚合的原理分组与聚合是数据分析工作中比较常见的操作,它主要根据一定的拆分标准将原数据拆分成若干个分组,然后对每个分组应用统计运算,并把运算后的结果合并到一起,便于用户对不同分组的数据进行深入解读。5.1

分组与聚合的原理分组与聚合的流程应用(apply)原数据按照一定的拆分标准被拆分为若干个分组。合并(combine)每个分组应用某个函数或方法进行相应的操作,并产生一个标量值。分组名称与标量值整合成新的对象。拆分(split)5.1

分组与聚合的原理分组与聚合的流程分组操作5.25.2.1

通过groupby()对数据进行分组掌握groupby()方法的使用,能够通过groupby()方法按照不同的拆分标准对数据进行分组学习目标5.2.1

通过groupby()对数据进行分组语法格式pandas的Series类或DataFrame类中提供了一个用于实现分组操作的方法groupby(),该方法可以按照不同的拆分标准将数据拆分成若干个分组。groupby(by=None,

axis=0,

level=None,

as_index=True,

sort=True,

group_keys=True,

squeeze=NoDefault.no_default,

observed=False,

dropna=True)by:用于确定分组的拆分标准。axis:表示沿着行或列拆分,取值可以为0(默认)或‘index’和1或‘columns’,其中0或‘index’代表沿着行拆分,1或‘columns’代表沿着列拆分。5.2.1

通过groupby()对数据进行分组语法格式pandas的Series类或DataFrame类中提供了一个用于实现分组操作的方法groupby(),该方法可以按照不同的拆分标准将数据拆分成若干个分组。groupby(by=None,

axis=0,

level=None,

as_index=True,

sort=True,

group_keys=True,

squeeze=NoDefault.no_default,

observed=False,

dropna=True)as_index:表示是否返回以分组标签作为索引的对象输出,默认值为True。sort:表示是否对分组标签进行排序,默认值为True。5.2.1

通过groupby()对数据进行分组语法格式pandas的Series类或DataFrame类中提供了一个用于实现分组操作的方法groupby(),该方法可以按照不同的拆分标准将数据拆分成若干个分组。groupby(by=None,

axis=0,

level=None,

as_index=True,

sort=True,

group_keys=True,

squeeze=NoDefault.no_default,

observed=False,

dropna=True)若groupby()方法的调用方是Series类的对象,则该方法的返回值是SeriesGroupBy对象;若groupby()方法的调用方是DataFrame类的对象,则该方法的返回值是DataFrameBy对象。5.2.1

通过groupby()对数据进行分组参数by参数by决定了按照什么样的标准对数据进行分组,该参数支持多种形式的值,包括列标签、列表、数组、Series类的对象、字典或函数,其中列表或数组的长度必须与待拆分轴上的数据个数相等。列标签列表数组Series类对象字典函数5.2.1

通过groupby()对数据进行分组按照列标签进行分组当使用groupby()方法对数据进行分组时,若给参数by传入的值是列标签,此时会将该列中值相同的行拆分出来整合成一个分组,值不同的行拆分出来自成为一个分组。importpandasaspddf_obj=pd.DataFrame({'key':['C','B','C','A','B','B','A','C','A'],'num':[2,4,6,8,10,1,14,16,18]})df_gb=df_obj.groupby(by='key')df_gb<pandas.core.groupby.generic.DataFrameGroupByobjectat0x00000277D703DB80>5.2.1

通过groupby()对数据进行分组按照列标签进行分组DataFrameGroupBy对象其实是一个可迭代的对象,可以直接使用for语句进行遍历。forgbindf_gb:print(gb)5.2.1

通过groupby()对数据进行分组按照Series类的对象进行分组当使用groupby()方法对数据进行分组时,若给参数by传入的值是Series类的对象,此时会根据Series类的对象中的值决定如何分组,若值相同,则需要将原数据中与值位置对应的行拆分成一个分组;若值不同,则需要将原数据中与值位置对应的行自成一个分组。importpandasaspddf_obj=pd.DataFrame({'key':['A','A','B','B','C'],'num':[2,3,4,6,8]})ser_obj=pd.Series(['a','b','c','a','b'])group_obj=df_obj.groupby(by=ser_obj)foriingroup_obj:print(i)5.2.1

通过groupby()对数据进行分组按照Series类的对象进行分组如果Series类对象的索引长度小于原对象的行索引长度,那么在使用groupby()方法进行分组时会怎么样呢?5.2.1

通过groupby()对数据进行分组按照Series类的对象进行分组如果Series类对象的索引长度小于原对象的行索引长度,那么在使用groupby()方法进行分组时,只会将原对象的部分数据进行分组,而不会将全部的数据进行分组。ser_diff=pd.Series(['a','b','a'])

group_obj=df_obj.groupby(by=ser_diff)foriingroup_obj:print(i)5.2.1

通过groupby()对数据进行分组按照字典进行分组当使用groupby()方法对数据进行分组时,若给参数by传入的值是字典,此时会将字典的键作为原对象行或列的标签索引,字典的值作为分组的名称,根据分组名称与标签索引的对应关系进行分组。frompandasimportDataFramenum_df=DataFrame({'a':[1,2,3,4],

'b':[5,6,7,8],'c':[9,10,11,12],

'd':[13,14,15,16],

'e':[17,18,19,20]})group_rule={'a':'Group_One','b':'Group_Two','c':'Group_One',

'd':'Group_Thr','e':'Group_Two'}group_obj=num_df.groupby(group_rule,axis=1)foriingroup_obj:print(i)5.2.1

通过groupby()对数据进行分组按照函数进行分组当使用groupby()方法对数据进行分组时,若给参数by传入的值是函数,则会让被拆分轴上的标签索引调用一次该函数,并根据返回的值决定如何分组,如果值相同,则会将对应的行或列整合成一组;如果值不同,则会将对应的行或列自成一组。importpandasaspddf_obj=pd.DataFrame({'a':[1,2,3,4,5],

'b':[6,7,8,9,10],

'c':[11,12,13,14,15]},

index=['Leo','Jack','Alice','Helen','Joe'])group_obj=df_obj.groupby(by=len)foriingroup_obj:print(i)5.2.2

查看分组信息掌握分组信息的查看方式,能够通过多种方式查看分组的信息学习目标5.2.2

查看分组信息无论是SeriesGroupBy对象和DataFrameGroupBy对象,它们其实都属于GroupBy对象。GroupBy对象其实是一个可迭代对象,无法通过直接输出的方式查看分组信息。如果希望查看分组的信息,除了通过前面介绍的for语句循环遍历之外,还可以通过GroupBy对象的属性或方法查看分组的信息。GroupBy对象5.2.2

查看分组信息我们也可以通过访问GroupBy对象的groups属性查看分组的信息,该属性的值是一个字典,字典中每个键值对对应一个分组。通过groups属性查看df_gb.groups

5.2.2

查看分组信息若希望获取一个分组,则可以通过GroupBy对象的get_group()方法实现。通过get_group()方法查看df_gb.get_group('A')获取分组Adf_gb.get_group('B')df_gb.get_group('C')获取分组B获取分组C数据聚合5.35.3.1

通过统计方法聚合数据熟悉统计方法的使用,能够通过统计方法实现数据聚合的功能学习目标5.3.1

通过统计方法聚合数据importpandasaspdimportnumpyasnpdf=pd.DataFrame({'key1':['A','A','B','B','A'],

'key2':['one','two','one','two','one'],

'data1':[2,3,4,6,8],

'data2':[3,5,np.nan,3,7]})group_obj=df.groupby('key1')group_obj.mean()前面介绍过pandas的统计方法,例如,用于获取最大值和最小值的max()和mix()、求平均数的mean()等,这些方法可以直接应用到分组,对分组的数据进行聚合操作。5.3.1

通过统计方法聚合数据在进行聚合操作时,如果分组的数据中有缺失值NaN,那么会自动忽略NaN值。5.3.2

通过agg()聚合数据熟悉agg()方法的使用,能够通过agg()方法实现数据聚合的功能学习目标5.3.2

通过agg()聚合数据语法格式除了直接使用统计方法聚合数据之外,我们还可以使用agg()方法聚合数据,该方法既支持内置函数也支持自定义函数,同时可以将这些函数作用于不同的行或列。agg(func=None,

axis=0,

*args,

**kwargs)func:用于聚合数据的函数,该参数的取值可以是匿名函数、函数名或方法名、包含函数名或方法名的列表或字典。axis:表示函数被应用到行或列,该参数支持0(默认值)或'index'和1或'columns'这几种取值,其中0或'index'表示将函数应用到每一列;1或'columns'表示将函数应用到每一行。5.3.2

通过agg()聚合数据语法格式除了直接使用统计方法聚合数据之外,我们还可以使用agg()方法聚合数据,该方法既支持内置函数也支持自定义函数,同时可以将这些函数作用于不同的行或列。※聚合数据的函数可以是前面提过的统计方法,也可以是用户自定义的函数。※我们在使用agg()方法聚合分组数据时,不仅可以让一个函数作用于分组数据的所有行或列,还可以让多个函数作用于分组数据的所有行或列,甚至可以让不同函数作用于分组数据的不同的行或列。agg(func=None,

axis=0,

*args,

**kwargs)5.3.2

通过agg()聚合数据所有列应用一个函数当使用agg()方法聚合数据时,若给参数func传入的值是一个匿名函数或函数名,不给axis参数传值,则此时会让分组数据的所有列应用这个函数,并执行相应的操作。importnumpyasnpfrompandasimportDataFrame,Seriesdf_obj=DataFrame(np.arange(36).reshape((6,6)),

columns=list('abcdef'))df_obj['key']=Series(list('aaabbb'),name='key')group_obj=df_obj.groupby('key')group_obj.agg(sum)5.3.2

通过agg()聚合数据所有列应用一个函数当然,我们在使用agg()方法时也可以传入自定义的函数。例如,定义一个用来计算极差值(极差值=最大值–最小值)的函数,使分组的所有列应用该函数计算极差值。defmy_range(arr):returnarr.max()-arr.min()group_obj.agg(my_range)5.3.2

通过agg()聚合数据所有列应用多个函数当使用agg()方法聚合数据时,若给参数func传入的值是一个包含函数名的列表,不给axis参数传值,则此时会让分组数据的所有列应用多个函数,并执行相应的操作。group_obj.agg([sum,my_range])

abc...f

summy_rangesummy_rangesummy_range...summy_rangekeya

181221122412...3312b721275127812...8712内层索引是函数的名称5.3.2

通过agg()聚合数据所有列应用多个函数如果函数名起的不够见名知意,那么不能很好地辨别出每列数据代表的含义。pandas的设计者已经考虑到这一点,它允许我们在应用函数的同时给函数指定名称,格式为(名称,函数名)。group_obj.agg([('和',sum),('极差',my_range)])

abcdef

极差

极差

极差

极差

极差

极差keya181221122412271230123312b721275127812811284128712内层索引是给函数另外指定的名称5.3.2

通过agg()聚合数据不同列应用不同函数当使用agg()方法聚合数据时,若给参数func传入的值是一个字典,不给axis参数传值,则可以让分组的一列应用一个函数,另一列应用另一个函数,并执行相应的操作。字典有着一定的格式要求,字典的键是分组的列索引,字典的值是函数名或包含函数名的列表。group_obj.agg({'a':'sum','b':'mean','c':my_range})给a列应用sum()函数,通过该函数计算该列数据的和给b列应用mean()函数,通过该函数计算该列数据的平均数给c列应用my_range()函数,通过该函数计算该列数据的极差分组级运算5.45.4.1

数据转换掌握transform()方法的使用,能够通过transform()方法实现数据转换的操作学习目标5.4.1

数据转换数据转换是pandas中强大的功能之一,它可以对分组执行一些汇总操作,且不改变分组之前的对象形状,使转换后对象的形状与分组前对象的形状保持一致。5.4.1

数据转换语法格式transform()方法可以将一个函数应用在分组上,对分组的列执行相应的操作。transform(func,

*args,

engine=None,

engine_kwargs=None,

**kwargs)func:表示每个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论