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

在Pandas中为阈值下连续值及非阈值行分配唯一分组

Pandas DataFrame添加自定义分组列问题

原始数据

现有如下Pandas DataFrame:

Groups  Names Values
G1      SP1   1
G1      SP1   5
G1      SP1   -2
G1      SP1   30
G1      SP1   50
G1      SP1   50
G1      SP1   -1
G1      SP1   2
G1      SP2   2
G1      SP2   20
G1      SP2   1
G2      SP3   30
G2      SP3   9
G2      SP3   3
G3      SP3   2

需求说明

需要添加new_group列,规则如下:

  • 遍历整个DataFrame,连续满足Values < 10的行分配同一唯一分组标识
  • 不满足Values < 10的每行单独分配一个唯一分组标识

预期结果

处理后的DataFrame如下:

Groups  Names Values new_groups
G1      SP1   1      NG1
G1      SP1   5      NG1
G1      SP1   -2     NG1
G1      SP1   30     NG2
G1      SP1   50     NG3
G1      SP1   50     NG4
G1      SP1   -1     NG5
G1      SP1   2      NG5
G1      SP2   2      NG5
G1      SP2   20     NG6
G1      SP2   1      NG7
G2      SP3   30     NG8
G2      SP3   9      NG9
G2      SP3   3      NG9
G3      SP3   2      NG10

示例说明:前3行连续满足Values < 10,分配分组NG1;第4行值>10,单独分配NG2;第5行值>10,单独分配NG3,以此类推。

数据字典格式

附该DataFrame的字典格式:

{'Groups': {0: 'G1', 1: 'G1', 2: 'G1', 3: 'G1', 4: 'G1', 5: 'G1', 6: 'G1', 7: 'G1', 8: 'G1', 9: 'G1', 10: 'G1', 11: 'G2', 12: 'G2', 13: 'G2',14:'G3'}, 
 'Names': {0: 'SP1', 1: 'SP1', 2: 'SP1', 3: 'SP1', 4: 'SP1', 5: 'SP1', 6: 'SP1', 7: 'SP1', 8: 'SP2', 9: 'SP2', 10: 'SP2', 11: 'SP3', 12: 'SP3', 13: 'SP3', 14 : 'SP3'}, 
 'Values': {0: 1, 1: 5, 2: -2, 3: 30, 4: 50, 5: 50, 6: -1, 7: 2, 8: 2, 9: 20, 10: 1, 11: 30, 12: 9, 13: 3, 14: 2}}

解决方案

可以通过以下步骤实现:

  1. 标记每行是否满足Values < 10
  2. 生成分组标识:不满足条件的行单独分组,连续满足条件的行归为同一组
  3. 将分组标识格式化为NG+数字的形式

具体代码如下:

import pandas as pd

# 加载数据
data = {'Groups': {0: 'G1', 1: 'G1', 2: 'G1', 3: 'G1', 4: 'G1', 5: 'G1', 6: 'G1', 7: 'G1', 8: 'G1', 9: 'G1', 10: 'G1', 11: 'G2', 12: 'G2', 13: 'G2',14:'G3'}, 
        'Names': {0: 'SP1', 1: 'SP1', 2: 'SP1', 3: 'SP1', 4: 'SP1', 5: 'SP1', 6: 'SP1', 7: 'SP1', 8: 'SP2', 9: 'SP2', 10: 'SP2', 11: 'SP3', 12: 'SP3', 13: 'SP3', 14 : 'SP3'}, 
        'Values': {0: 1, 1: 5, 2: -2, 3: 30, 4: 50, 5: 50, 6: -1, 7: 2, 8: 2, 9: 20, 10: 1, 11: 30, 12: 9, 13: 3, 14: 2}}
df = pd.DataFrame(data)

# 标记是否满足条件
df['is_small'] = df['Values'] < 10

# 生成分组ID:不满足条件的行单独分组,连续满足条件的行归为一组
df['group_id'] = (
    (~df['is_small']) | (df['is_small'] & ~df['is_small'].shift(fill_value=False))
).cumsum()

# 格式化为NG+数字的形式
df['new_groups'] = 'NG' + df['group_id'].astype(str)

# 移除中间辅助列(可选)
df = df.drop(['is_small', 'group_id'], axis=1)

print(df)

运行代码后即可得到预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:01:07