itertools中的groupby()的原理及其骚操作

原理

导包:

from itertools import groupby

其实groupby就是对可迭代对象的批量操作。(可迭代对象就是像list、dict、迭代器等这种可以用for循环遍历的数据结构或者对象)

groupby()的作用就是把可迭代对象中相邻的重复元素挑出来放一起,举个例子:

for key, group in groupby('AAABBBCCAAA'):
    print(key, list(group))

输出:

A ['A', 'A', 'A']
B ['B', 'B', 'B']
C ['C', 'C']
A ['A', 'A', 'A']

其中变量key表示的是重复元素,group是一个itertools._grouper类型的变量,也是个迭代对象,'''list(group)'''表示的是将迭代对象转化为列表。

具体原理如下图所示:

实际上挑选规则是通过函数完成的,只要作用于函数的两个元素返回的值相等,这两个元素就被认为是在一组的,而函数返回值作为组的key。如果我们要忽略大小写分组,就可以让元素'A'和'a'都返回相同的key:

for key, group in groupby('AaaBBbcCAAa', lambda c: c.upper()):
    print(key, list(group))

具体原理如下图所示:

骚操作

有这么一个情形,我要处理pandas.DataFrame表格数据,如下图所示,value这一列有很多连续的空值,空值处理需求如下:

  1. 连续空值行数超过10次的行全部按行删掉;
  2. 连续空值行数小于等于10次的,则取上一个实数值和下一个实数值的均值来补全。

试问应该怎么做?

答案:

NUM_NAN = 10

nan_r, _ = np.where(np.isnan(df))  # 找到所有NaN的值位置,nan_r表示行标,占位符_表示列标

# 统计哪一块数据应该删除
nan_list = []  # 只收集连续空值超过NUM_NAN个数的行索引
fun = lambda x: x[1] - x[0]
for k, g in groupby(enumerate(nan_r), fun):
    find_list = [j for i, j in g]  # 连续数字的列表
    if len(find_list) > NUM_NAN:  # 时间连续的点超过NUM_NAN个就删掉
        nan_list = nan_list + find_list

# 存较大片的缺省值,进行删除
if len(nan_list) != 0:
    df = df.reset_index()
    df = df.drop(nan_list)
    df = df.set_index(df['time'])
    df = df.drop(['time'], axis=1)
    
# 缺省值取前一行和后一行的均值
df = (df.fillna(method='backfill') + df.fillna(method='pad')) / 2

df.to_csv('test.csv')

  • 24
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
itertools.groupby是Python标准库的一个函数,它可以根据指定的键对可迭代对象进行分组。在使用groupby函数时,通常需要先对可迭代对象进行排序,以确保相同的键值在一起。 下面是使用itertools.groupby对可迭代对象进行排序的一般步骤: 1. 首先,导入itertools模块:`import itertools` 2. 准备一个可迭代对象,例如一个列表或者一个生成器。 3. 对可迭代对象进行排序,可以使用sorted函数或者list.sort方法。排序的依据是你希望进行分组的键值。 4. 使用itertools.groupby函数对排序后的可迭代对象进行分组。groupby函数接受两个参数:可迭代对象和一个用于分组的键值函数。 5. 遍历groupby函数的结果,可以得到每个分组的键值和对应的元素列表。 下面是一个示例代码,演示了如何使用itertools.groupby对列表进行排序和分组: ```python import itertools # 准备一个待排序的列表 data = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5] # 对列表进行排序 sorted_data = sorted(data) # 使用itertools.groupby对排序后的列表进行分组 groups = itertools.groupby(sorted_data) # 遍历分组结果 for key, group in groups: print(key, list(group)) ``` 运行以上代码,输出结果如下: ``` 1 [1, 1] 2 [2, 2] 3 [3, 3] 4 [4, 4] 5 [5, 5] ``` 以上代码,首先对列表进行排序,然后使用groupby函数对排序后的列表进行分组。最后,通过遍历分组结果,可以得到每个分组的键值和对应的元素列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值