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

如何基于DataFrame列的递增连续序列创建分组?

解决DataFrame按连续递增/相等规则分组的问题

问题说明

给定以下DataFrame:

import pandas as pd
df = pd.DataFrame(
    {
        'a': [10, 14, 20, 10, 12, 5, 3]
    }
)

需要按照从上到下,只要列a的值递增或相等则分组不变;当当前行a的值小于前一行时,切换新分组的规则,将数据拆分为4个分组,预期输出如下:

a
0  10
1  14
2  20

    a
3  10
4  12

    a
5   5

    a 
6   3 

用户尝试了以下代码,但不知道后续步骤:

import numpy as np
df['dir'] = np.sign(df.a.shift(-1) - df.a)

解决方案

核心思路是标记分组切换的节点,生成分组ID后拆分输出:

完整代码

import pandas as pd
import numpy as np

# 原始数据
df = pd.DataFrame({'a': [10, 14, 20, 10, 12, 5, 3]})

# 生成分组ID:当当前行a小于前一行时,分组ID+1
df['group_id'] = (df['a'] < df['a'].shift()).cumsum()

# 遍历分组并输出
for group_id in df['group_id'].unique():
    # 只保留a列,匹配预期输出格式
    current_group = df[df['group_id'] == group_id][['a']]
    print(current_group)
    print()  # 空行分隔不同分组

代码解释

  1. 标记分组切换点:df['a'] < df['a'].shift()生成布尔序列,True表示当前行a的值小于前一行,这就是分组需要切换的位置。
  2. 生成分组ID:对布尔序列使用cumsum()累加(布尔值会被转为1/0),这样每个切换点之后的行会自动获得新的分组ID。
  3. 拆分并输出:遍历所有唯一的分组ID,筛选对应行并只保留a列,输出时用空行分隔分组,完全匹配预期格式。

对用户尝试代码的补充

你之前用np.sign(df.a.shift(-1)-df.a)是比较当前行和下一行的关系,但规则是基于当前行和前一行的比较,所以方向反了,调整为和前一行的对比即可实现需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 01:35:09