楼主: zwy_0309
1185 3

Python中数据的分组和聚合运算 [推广有奖]

  • 1关注
  • 3粉丝

硕士生

36%

还不是VIP/贵宾

-

威望
0
论坛币
342 个
通用积分
99.1487
学术水平
11 点
热心指数
9 点
信用等级
7 点
经验
4173 点
帖子
69
精华
0
在线时间
148 小时
注册时间
2019-6-4
最后登录
2024-3-29

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

数据分析中,我们常用到三种重要的过程:
    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定义了一个函数,先声明变量,再用“:”引出算法。


二维码

扫码加我 拉你入群

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

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

关键词:python Dataframe columns Gender Groups

已有 2 人评分经验 论坛币 收起 理由
cheetahfly + 100 精彩帖子
happy_287422301 + 40 鼓励积极发帖讨论

总评分: 经验 + 100  论坛币 + 40   查看全部评分

沙发
npv7910 发表于 2020-8-26 16:34:00 |只看作者 |坛友微信交流群
谢谢分享。
已有 1 人评分经验 论坛币 收起 理由
happy_287422301 + 100 + 40 补偿

总评分: 经验 + 100  论坛币 + 40   查看全部评分

使用道具

藤椅
zwy_0309 在职认证  发表于 2020-8-27 10:39:31 |只看作者 |坛友微信交流群
npv7910 发表于 2020-8-26 16:34
谢谢分享。
谢谢鼓励!

使用道具

板凳
zwy_0309 在职认证  发表于 2020-12-17 14:39:31 |只看作者 |坛友微信交流群
分组还有一种写法:dataframe.groupby(['列名1', '列名2'])[['列名3’, '列名4']].聚合函数
这里groupby() 中的列表,即索引列,可以不加表名; 但需要聚合的列要放在groupby()后,也不用加表名。

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-18 03:38