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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 20:54:02