Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python 新手突破瓶颈指南:通过 itertools.groupby 进行数据分组

Python 新手突破瓶颈指南:通过 itertools.groupby 进行数据分组

作者头像
MegaQi
发布于 2024-08-20 13:24:23
发布于 2024-08-20 13:24:23
44000
代码可运行
举报
运行总次数:0
代码可运行

在数据处理和分析中,我们常常需要根据某些条件对数据进行分组。itertools.groupby() 能够帮助我们轻松实现这一功能。

工作机制

itertools.groupby() 会对输入的可迭代对象进行分组,返回一个迭代器,该迭代器生成连续键值对,其中每个键值对的键是分组依据,值是一个生成器,生成对应分组的元素。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class groupby(object):
    """
    make an iterator that returns consecutive keys and groups from the iterable
    
      iterable
        Elements to divide into groups according to the key function.
      key
        A function for computing the group category for each element.
        If the key function is not specified or is None, the element itself
        is used for grouping.
    """
  • iterable: 要分组的可迭代对象。
  • key: 一个函数,用于指定分组依据。如果未指定,则使用元素本身进行分组。

基本示例

以下是一个简单的示例,演示如何使用 itertools.groupby() 对列表进行分组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import itertools

data = [1, 1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
grouped = itertools.groupby(data)

for key, group in grouped:
    print(f'Key: {key}, Group: {list(group)}')

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Key: 1, Group: [1, 1]
Key: 2, Group: [2, 2]
Key: 3, Group: [3, 3, 3]
Key: 4, Group: [4, 4, 4, 4]

在这个例子中,itertools.groupby() 将连续相同的元素分组。

从底层逻辑来看,itertools.groupby() 通过遍历输入的可迭代对象,并根据键函数返回的值进行分组。如果键函数未指定,则默认使用元素本身作为键。需要注意的是,itertools.groupby() 只会对相邻的元素进行分组,因此在使用之前通常需要对数据进行排序。

比如,上边的 data 是个非排序数组

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import itertools

data = [1, 4, 2, 4, 3, 3, 3, 4, 4, 4, 4]
grouped = itertools.groupby(data)

for key, group in grouped:
    print(f'Key: {key}, Group: {list(group)}')

则输出为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Key: 1, Group: [1]
Key: 4, Group: [4]
Key: 2, Group: [2]
Key: 4, Group: [4]
Key: 3, Group: [3, 3, 3]
Key: 4, Group: [4, 4, 4, 4]

应用场景

1. 对列表进行分组

在实际应用中,通常需要对列表进行分组,例如根据值的相等性对元素分组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import itertools

data = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
data.sort()
grouped = itertools.groupby(data)

for key, group in grouped:
    print(f'Key: {key}, Group: {list(group)}')

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Key: apple, Group: ['apple', 'apple', 'apple']
Key: banana, Group: ['banana', 'banana']
Key: orange, Group: ['orange']

2. 按照对象属性分组

itertools.groupby() 还可以用于根据对象的属性进行分组。例如,有一个包含多个字典的列表,可以按某个键的值进行分组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import itertools

data = [
    {'name': 'Alice', 'age': 30},
    {'name': 'Bob', 'age': 25},
    {'name': 'Charlie', 'age': 30},
    {'name': 'David', 'age': 25}
]

data.sort(key=lambda x: x['age'])
grouped = itertools.groupby(data, key=lambda x: x['age'])

for key, group in grouped:
    print(f'Age: {key}')
    for item in group:
        print(f'    {item}')

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Age: 25
    {'name': 'Bob', 'age': 25}
    {'name': 'David', 'age': 25}
Age: 30
    {'name': 'Alice', 'age': 30}
    {'name': 'Charlie', 'age': 30}

3. 处理日志文件

在分析日志文件时,可以根据时间戳或日志级别对日志进行分组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import itertools

logs = [
    '2023-01-01 INFO Start processing',
    '2023-01-01 ERROR Something went wrong',
    '2023-01-02 INFO Continue processing',
    '2023-01-02 ERROR Another error occurred'
]

logs.sort(key=lambda log: log.split()[0]) 
grouped = itertools.groupby(logs, key=lambda log: log.split()[0])

for date, group in grouped:
    print(f'Date: {date}')
    for log in group:
        print(f'    {log}')

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Date: 2023-01-01
    2023-01-01 INFO Start processing
    2023-01-01 ERROR Something went wrong
Date: 2023-01-02
    2023-01-02 INFO Continue processing
    2023-01-02 ERROR Another error occurred

小结

通过掌握 itertools.groupby() 的用法,Python 开发者可以在数据处理和分析中编写出更高效、更简洁的代码。无论是在对列表分组、根据对象属性分组,还是在处理日志文件等场景中,itertools.groupby() 都能发挥重要作用。

有收获 请关注 不迷路

如果不想错过精彩干货 务必公众号加星🌟

点赞、转发、在看 一键三连是分享动力

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 非典型性程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python提升“技术逼格”的6个方法
Python中的聚合类函数sum,min,max第一个参数是iterable类型,一般使用方法如下:
double
2019/12/23
3690
Python进阶笔记
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。一般是利用原有的数据结构来生成新的列表。
py3study
2020/01/03
1.1K0
Python基础(九) | time random collections itertools标准库详解
(2)time.perf_counter()   随意选取一个时间点,记录现在时间到该时间点的间隔秒数,记录sleep
timerring
2022/10/06
6530
Python基础(九) | time random collections itertools标准库详解
Day20内建模块itertools&urllib
itertools Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数。 首先,我们看看itertools提供的几个“无限”迭代器: >>> import itertools >>> natuals = itertools.count(1) >>> for n in natuals: ... print(n) ... 1 2 3 ... 因为count()会创建一个无限的迭代器,所以上述代码会打印出自然数序列,根本停不下来,只能按Ctrl+C退出。 cycle()会把
林清猫耳
2018/04/26
6020
Python: itertools模块任性迭代
itertools 模块 该模块包含了一系列处理可迭代对象(sequence-like)的函数,从此迭代更任性。 迭代器有一些特点,比如lazy,也就是只有用到的时候才读入到内存里,这样更快更省内存;比如只能调用一次,会被消耗掉。 import itertools as itls 合并迭代器: chain()与izip() chain()函数接收n个可迭代对象,然后返回一个他们的合集的迭代器,纵向合并,上例子。 for i in itls.chain([1,2,3],['a','b','c']):
用户2183996
2018/06/21
6580
进阶的运维开发(二)- 迭代器和生成器
python迭代器于平常的可迭代对象相比,拥有占用字节少等优点,往往在处理大量可迭代对象的时候应该优先考虑迭代器实现,如下面的例子:
奔跑的骆驼
2020/01/29
6770
Python标准库(1) — itertools模块
專 欄 ❈Jerry,Python中文社区专栏作者。 blog:https://my.oschina.net/jhao104/blog github:https://github.com/jhao104 ❈— 简介 官方描述:Functional tools for creating and using iterators.即用于创建高效迭代器的函数。 itertools.chain(*iterable) 将多个序列作为一个单独的序列返回。 例如: import itertoolsfor each
Python中文社区
2018/01/31
6960
【Python入门第十三讲】可迭代对象(Iterable)、迭代器(Iterator)和生成器(Generator)
在 Python 中,可迭代对象(Iterable)、迭代器(Iterator)和生成器(Generator)是处理数据集合和处理大数据时常用的概念和工具。
不惑
2024/02/08
1.7K0
【Python入门第十三讲】可迭代对象(Iterable)、迭代器(Iterator)和生成器(Generator)
相见恨晚的 Python 内置库:itertools
来源 : 忆先 01 前言 很多人都致力于把Python代码写得更Pythonic,一来更符合规范且容易阅读,二来一般Pythonic的代码在执行上也更有效率。今天就先给大家介绍一下Python的系统库itertools。 02 itertools库 迭代器(生成器)在Python中是一种很常用也很好用的数据结构,比起列表(list)来说,迭代器最大的优势就是延迟计算,按需使用,从而提高开发体验和运行效率,以至于在Python 3中map,filter等操作返回的不再是列表而是迭代器。 话虽这么说但大家平
张俊红
2022/03/03
7170
《利用Python进行数据分析·第2版》第10章 数据聚合与分组运算10.1 GroupBy机制10.2 数据聚合10.3 apply:一般性的“拆分-应用-合并”10.4 透视表和交叉表10.5 总
对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是数据分析工作中的重要环节。在将数据集加载、融合、准备好之后,通常就是计算分组统计或生成透视表。pandas提供了一个灵活高效的gruopby功能,它使你能以一种自然的方式对数据集进行切片、切块、摘要等操作。 关系型数据库和SQL(Structured Query Language,结构化查询语言)能够如此流行的原因之一就是其能够方便地对数据进行连接、过滤、转换和聚合。但是,像SQL这样的查询语言所能执行的分组运算的种类很有限。在本章中你将会看
SeanCheney
2018/04/24
5.1K0
《利用Python进行数据分析·第2版》第10章 数据聚合与分组运算10.1 GroupBy机制10.2 数据聚合10.3 apply:一般性的“拆分-应用-合并”10.4 透视表和交叉表10.5 总
Python_sort函数结合funct
针对sort(key=cmp_to_key(cmp))及函数cmp所产生的作用尝试分析。
py3study
2020/01/23
7670
Python3标准库built-in、
Python3中实现了很多生成器函数,本篇主要介绍built-in、itertools、functools模块中的生成器。
py3study
2020/01/02
1.5K0
Python语言的精华:Itertools库
前言 你知道Python的Itertools库被认为是Python的瑰宝吗?一些用户甚至认为它是最酷和最令人惊叹的Python库之一。我们可以使用Itertools模块来丰富我们的应用程序,并在更短的
HuangWeiAI
2020/09/23
9630
Python语言的精华:Itertools库
40个你可能不知道的Python的特点和技巧
1、拆箱 >>> a, b, c = 1, 2, 3 >>> a, b, c (1, 2, 3) >>> a, b, c = [1, 2, 3] >>> a, b, c (1, 2, 3) >>> a, b, c = (2 * i + 1 for i in range(3)) >>> a, b, c (1, 3, 5) >>> a, (b, c), d = [1, (2, 3), 4] >>> a 1 >>> b 2 >>> c 3 >>> d 4     2、使用拆箱进行变量交换 >>> a, b = 1
Java学习123
2018/05/16
6780
Python标准库(1) — itertools模块
目录[-] 简介 官方描述:Functional tools for creating and using iterators.即用于创建高效迭代器的函数。 itertools.chain(*iterable) 将多个序列作为一个单独的序列返回。 例如: import itertools for each in itertools.chain('i', 'love', 'python'): print each 输出: i l o v e p y t h o n itertools.combin
jhao104
2018/03/20
9080
python中的yield和return
yield和return的区别与python中的generator和iterables相关,所以要了解其不同,首先要明白产生器和迭代器。
Tim在路上
2020/08/05
1K0
Python 新手突破瓶颈指南:使用 itertools.chain 连接多个可迭代对象
在数据处理中,我们经常需要将多个可迭代对象连接起来形成一个统一的迭代器。itertools.chain() 是一个很好的工具,可以简化这个过程,使代码更简洁高效。
MegaQi
2024/08/07
4530
Python 新手突破瓶颈指南:使用 itertools.chain 连接多个可迭代对象
groupby函数详解
这是由于变量grouped是一个GroupBy对象,它实际上还没有进行任何计算,只是含有一些有关分组键df[‘key1’]的中间数据而已,然后我们可以调用配合函数(如:.mean()方法)来计算分组平均值等。   因此,一般为方便起见可直接在聚合之后+“配合函数”,默认情况下,所有数值列都将会被聚合,虽然有时可能会被过滤为一个子集。   一般,如果对df直接聚合时, df.groupby([df['key1'],df['key2']]).mean()(分组键为:Series)与df.groupby(['key1','key2']).mean()(分组键为:列名)是等价的,输出结果相同。   但是,如果对df的指定列进行聚合时, df['data1'].groupby(df['key1']).mean()(分组键为:Series),唯一方式。 此时,直接使用“列名”作分组键,提示“Error Key”。 注意:分组键中的任何缺失值都会被排除在结果之外。
全栈程序员站长
2022/08/24
3.9K0
groupby函数详解
itertools模块详解
tee()创建的迭代器共享其输入迭代器,所以一旦创建了新迭代器,就不应该再使用远迭代器。
用户2936342
2018/08/27
4900
python︱ collections模块(namedtuple/defaultdict/OrderedDict等)
给[‘x’,‘y’]这个tuple命名为point,这个tuple中,第一个空位命名为'x',第二个为'y'。
悟乙己
2019/05/26
1.9K0
推荐阅读
相关推荐
Python提升“技术逼格”的6个方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验