Python:用groupby() 进行字段分组
作者:互联网
groupby 分组实践
我们要对一个字典的序列,按照某一个特征分组,例如按照天气weather、日期date分组迭代显示。
天气预测记录record:
[{'date': '2021-09-15', 'weather': 'cloud'},
{'date': '2021-09-13', 'weather': 'sunny'},
{'date': '2021-09-14', 'weather': 'cloud'},
{'date': '2021-09-13', 'weather': 'rain'},
{'date': '2021-09-13', 'weather': 'cloud'},
{'date': '2021-09-14', 'weather': 'rain'}]
1、对 ‘weather’ 字段进行分组
record = [{'date': '2021-09-15', 'weather': 'cloud'},
{'date': '2021-09-13', 'weather': 'sunny'},
{'date': '2021-09-13', 'weather': 'rain'},
{'date': '2021-09-14', 'weather': 'cloud'},
{'date': '2021-09-13', 'weather': 'cloud'},
{'date': '2021-09-14', 'weather': 'rain'}]
# 对天气字段'weather'分组汇总
from itertools import groupby
for k, items in groupby(record, key=lambda x:x['weather']):
print(k)
for i in items:
print(i)
可以发现,分出来的结果不是我们所理想的。因为groupby() 仅仅检查连续的元素,如果事先并没有排序完成的话,分组函数将得不到想要的结果。
# 排序
record.sort(key=lambda x: x['weather'])
# 对天气字段'weather'分组汇总
for k, items in groupby(record, key=lambda x:x['weather']):
print(k)
for i in items:
print(i)
增加排序 record.sort(key=lambda x: x['weather'])
语句,在遍历,显示的结果如下: 这是我们想要的结果。
2、对 ‘date’ 字段进行分组
注意到sort 和groupby 所用的key 函数,除了lambda 写法外,还有一种简写,就是使用itemgetter
。
from operator import itemgetter
from itertools import groupby
record = [{'date': '2021-09-15', 'weather': 'cloud'},
{'date': '2021-09-13', 'weather': 'sunny'},
{'date': '2021-09-13', 'weather': 'rain'},
{'date': '2021-09-14', 'weather': 'cloud'},
{'date': '2021-09-13', 'weather': 'cloud'},
{'date': '2021-09-14', 'weather': 'rain'}]
# 排序
record.sort(key=itemgetter('date'))
# 对日期字段'date'分组汇总
for k, items in groupby(record, key=itemgetter('date')):
print(k)
for i in items:
print(i)
itemgetter 是一个类, itemgetter(‘weather’) 返回一个可调用的对象。
3、对 groupby 多字段进行分组
# 对天气字段'weather'分组汇总,对date在组内排序
from itertools import groupby
from operator import itemgetter
record = [{'date': '2021-09-15', 'weather': 'cloud'},
{'date': '2021-09-13', 'weather': 'sunny'},
{'date': '2021-09-13', 'weather': 'rain'},
{'date': '2021-09-14', 'weather': 'cloud'},
{'date': '2021-09-13', 'weather': 'cloud'},
{'date': '2021-09-14', 'weather': 'rain'}]
# 排序weather 和date 两个字段
record.sort(key=itemgetter('weather', 'date'))
for k, items in groupby(record, itemgetter('weather')):
print("天气:", k)
for i in items:
print(i)
结果如下,使用weather 和date 两个字段排序:
groupby() 函数扫描整个序列并且查找连续相同值(或者根据指定 key 函数返回值相同)的元素序列。 在每次迭代的时候,它会返回一个值和一个迭代器对象, 这个迭代器对象可以生成元素值全部等于上面那个值的组中所有对象。
标签:Python,09,weather,分组,2021,date,groupby,cloud 来源: https://blog.csdn.net/weixin_44775255/article/details/120573081