全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 python论坛
1377 3
2020-08-26

数据分析中,我们常用到三种重要的过程:
    1、分组

    2、聚合

    3、显示

本例接续前几课的笔记,仍以这组数据为例:

29.png

一、 统计男女学生的人数

我想到的最简单的办法是:

frame['gender'].value_counts()

但如果统计较为复杂,我们还是应该先分组,再做聚合类的计算,方法如下:

【脚本】

groups = frame.groupby('gender')    print(groups.count())

【结果】

       ID  name  age height

gender                       

False   3     3    3      3

True    4     4    4      4


【脚本改进】只对性别字段进行分组,print时,就不用写明对哪个字段count()了。

groups = frame['gender'].groupby(frame['gender'])
print(groups.count())

【结果】

gender

False   3

True    4

二、 对统计结果重命名

统计结果其实也是DataFrame数据,可以对其进行DataFrame的操作,比如重命名:

【脚本】

print(groups.count().rename( columns={'gender':'genderName'} ))

#注意columns= 后面是字典类型的数据



三、 对统计结果进行排序

1、按统计数量排序

【脚本】

print(frame['age'].groupby(frame['age']).count().sort_values() )

【结果】

age

13   1

17   1

20   1

18   2

19   2

大家可以看到,统计结果按每组人数不同排序


2、按统计列名排序

【脚本】

print(frame['age'].groupby(frame['age']).count().sort_index() )

【结果】

age

13   1

17   1

18   2

19   2

20   1


四、 多条件统计结果进行排序

按年龄、性别统计学生个数,并按年龄降序性别升序排序

【脚本】

print(frame[['ID']].groupby( [frame['age'],frame['gender']] ).count().sort_values(by=['age','gender'],ascending=[False,True] ) )

【结果】

            ID

age gender   

20 True     1

19 True     2

18 False    2

17 False    1

13 True     1

注意:

1、该脚本看上去很酷,一行解决问题,却不易调试,不如多用几个变量分步写,条理清楚,不易写乱。


2、groupby()方法,在只有一个参数时可以直接写成这样:groupby(frame['age']), groupby('gender'),但多个参数时,就要这样写了groupby([ frame['age'],frame['gender'] ])中间参数是列表形式,且frame[]不可省略


3sort_values()中各参数也是列表形式,但可以省略frame[]


五、 扩展统计功能
1、如:按用户名字的长度统计。
统计字符长度不是DataFrame的运算方法,但统计字符串长度,我们可以用len() ,我个人想到的第一个解决方法是这样的:frame['name'].groupby( len(frame['name']))

结果报错了:get_grouper raiseKeyError(gpr)

怎么解决?使用apply(),让排序的姓名应用一个方法——计算字符长度的方法frame['name'].apply(len)
【脚本】
print(frame['name'].groupby( frame['name'].apply(len)).count() )

【结果】

name2    7

2、应用自定义函数统计男、女生各自的身高差
print(frame[['height']].groupby(frame['gender']).apply( lambda arr :arr.max()-arr.min() ))
说明:
1)这里是需要先按性别将身高分组,再对结果应用自定义函数,所以这里的apply()就在groupby()的括号外面,这个写法,与上面的groupby( frame['name'].apply(len))不同。
2)lambda定义了一个函数,先声明变量,再用“:”引出算法。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2020-8-26 16:34:00
谢谢分享。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2020-8-27 10:39:31
npv7910 发表于 2020-8-26 16:34
谢谢分享。
谢谢鼓励!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2020-12-17 14:39:31
分组还有一种写法:dataframe.groupby(['列名1', '列名2'])[['列名3’, '列名4']].聚合函数
这里groupby() 中的列表,即索引列,可以不加表名; 但需要聚合的列要放在groupby()后,也不用加表名。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群