分组处理数据,你只会使用 pandas? 那你就错了。其实不借助第三方库,我们也可以轻松实现数据分组。
今天内容:
- 使用字典做数据分组
- 使用 itertools 的 groupby 实现数据分组
- 如何封装函数,使其更具通用性
分组
字典是python中非常常用的一种数据结构。我们可以用字典来实现数据分组。
比如,我们有这样一个列表:
people_list = [
{'姓名': '张三', '性别': '男', '年龄': '25'},
{'姓名': '李四', '性别': '女', '年龄': '30'},
{'姓名': '王五', '性别': '男', '年龄': '22'},
{'姓名': '赵六', '性别': '女', '年龄': '28'},
{'姓名': '周六', '性别': '女', '年龄': '26'},
{'姓名': '陈七', '性别': '男', '年龄': '24'},
{'姓名': '杨八', '性别': '女', '年龄': '27'},
]
我们想按照性别分组,统计平级年龄和人数。
使用字典的实现方式:
结果:
现在结果字典有两项数据(男性和女性),分别对应着两个列表(里面就是该性别的数据,是一个个字典)。
上面代码,可以使用 defaultdict 改进:
行21: 当访问一个不存在的键时,defaultdict 会自动创建一个空列表,并返回它。
如果不想使用字典,而是想使用 itertools 的 groupby 实现,可以这样:
行15:分组前对数据做排序才行
封装函数
现在已经对数据进行了分组,所谓的分组统计(平级年龄和人数),只不过是对每个性别的列表进行遍历,统计每个人的年龄,然后求和。
但统计处理多种多样,为此我们可以封装成通用的函数。
假设封装的函数叫 group_by ,看看我们期待的使用方式:
- 行9:参数 by :指定分组的字段,也可以指定多个字段,比如 by=["性别", "年龄"] 。
- 行9:参数 aggregate :指定聚合函数。
确定了使用方式,那么我们可以开始封装函数:
- 行20-23:让参数 by 支持单个字符串或多列分组
- 行29:再次遍历分组的结果,然后应用聚合函数