pandas如何高效将DataFrame拆分为difference=1的连续行分组
优化实现方案
你原有通过连续值变化标记分组的思路是成立的,不过给出的代码里g.df((...))应该是笔误,正确应为g.groupby((...))。我们可以通过提前过滤无效行、减少后续循环判断逻辑来提升效率,具体实现如下:
核心代码实现
import pandas as pd # 构造分组标记,仅 difference 为1的行才会分配有效分组ID,其余行标记为-1 # 若difference为浮点型存在精度问题,可将eq(1)替换为between(0.9, 1.1) df['group_id'] = ( (df['difference'].ne(df['difference'].shift()) & df['difference'].eq(1)) .cumsum() .where(df['difference'].eq(1), -1) ) # 直接提取所有有效分组,无需额外判断 valid_groups = [group_df for _, group_df in df[df['group_id'] != -1].groupby('group_id')] # 遍历分组处理即可 for group in valid_groups: # do stuff print(group)
方案优势
对比你原来的写法,有两个明显的优化点:
- 提前过滤了
difference不等于1的无效行,不会为这些行生成不需要的分组,减少了后续循环遍历的次数 - 省去了循环中对分组值是否符合要求的判断逻辑,拿到的
valid_groups已经完全符合你的需求 - 大数量级下性能提升明显,逻辑更简洁易读
验证结果
针对你给出的示例数据,上述代码得到的valid_groups长度为3,刚好对应索引0-5、8-11、13-19的三个分组,完全符合要求。
内容的提问来源于stack exchange,提问作者Ari
相关产品推荐
相关产品推荐

