在数据分析中,我们常用到三种重要的过程:
1、分组
2、聚合
3、显示
本例接续前几课的笔记,仍以这组数据为例:
我想到的最简单的办法是:
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[]不可省略。
3、sort_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 72、应用自定义函数统计男、女生各自的身高差
print(frame[['height']].groupby(frame['gender']).apply( lambda arr :arr.max()-arr.min() ))
说明:
1)这里是需要先按性别将身高分组,再对结果应用自定义函数,所以这里的apply()就在groupby()的括号外面,这个写法,与上面的groupby( frame['name'].apply(len))不同。
2)lambda定义了一个函数,先声明变量,再用“:”引出算法。