You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas:如何用列表推导式优化DataFrame的游程编码统计逻辑?

游程编码分组统计的代码优化

需求说明

你有一个以datetime为索引的DataFrame,已通过itertools.groupby实现游程编码(RLE),需要统计满足分组值>=65且分组长度>=185的分组数量,当前用for循环实现,希望用更简洁高效的方式优化。

原始代码冗余点

你写的for循环逻辑清晰但代码冗余,他人提供的count2代码逻辑与需求不符(其试图计算分组可拆分的滚动窗口数量),无需参考。

优化方案

方案1:生成器表达式(最简洁高效)

利用Python中True等价于1、False等价于0的特性,直接用sum累加符合条件的分组数量。生成器表达式相比列表推导式更节省内存,适合处理大数据量:

count_opt = sum(1 for k, length in rle if k >= 65 and length >= 185)

方案2:列表推导式

如果偏好列表推导式的写法,也可以实现(内存占用略高于生成器表达式):

count_opt = sum([1 for k, length in rle if k >= 65 and length >= 185])

方案3:纯Pandas实现(无需手动写RLE)

可以直接用Pandas的分组功能替代手动游程编码,代码更贴合Pandas生态,可读性更强:

# 生成游程分组标识:相邻值不同则分组ID+1
dd['group_id'] = (dd['mean_base'] != dd['mean_base'].shift()).cumsum()
# 计算每个分组的数值和长度
group_info = dd.groupby('group_id')['mean_base'].agg(['first', 'count'])
# 筛选满足条件的分组并统计数量
count_pandas = len(group_info[(group_info['first'] >= 65) & (group_info['count'] >= 185)])

验证说明

上述三种优化方案的输出结果与你原始代码中的count1完全一致,但代码更简洁、执行效率更高。

内容的提问来源于stack exchange,提问作者Sushil Kokil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:25:25