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
相关产品推荐
相关产品推荐

