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

如何用Pandas实现分组内正负连续值的计数?

解决Pandas按组统计连续正负值计数的问题

原始数据

group  val  count???
     a    2         1
     a    2         2
     b    1         1
     a    2         3
     b   -3         1
     b   -3         2
     a   -7         1
     a   -5         2

需求说明

现有包含group和val列的DataFrame,需要生成count列,规则为:

  • 按group分组
  • 每组内统计连续处于同一正负区间的数值数量
  • 当数值正负性改变时,计数器重置为1重新计数

例如:某组数值为[1, -1, 1, 1],对应计数值为[1, 1, 1, 2]

实现代码

import pandas as pd
import numpy as np

# 构造原始DataFrame
df = pd.DataFrame({
    'group': ['a', 'a', 'b', 'a', 'b', 'b', 'a', 'a'],
    'val': [2, 2, 1, 2, -3, -3, -7, -5]
})

# 1. 生成正负标识:正数为1,负数为-1
df['sign'] = np.sign(df['val'])

# 2. 按group分组,标记每组内正负性变化的分段
df['segment'] = df.groupby('group')['sign'].transform(
    lambda x: x.diff().ne(0).cumsum()
)

# 3. 按group+segment分组,生成连续计数(从1开始)
df['count'] = df.groupby(['group', 'segment']).cumcount() + 1

# 清理中间辅助列(可选)
df = df.drop(['sign', 'segment'], axis=1)

print(df)

代码解释

  1. 正负标识列:用np.sign()快速将数值转换为正负标记,简化后续的连续性判断。如果存在0值,可根据需求调整(比如将0归为单独一类,或合并到正/负区间)。
  2. 分段标记:在每个group内,通过diff()判断当前行与前一行的正负性是否变化,ne(0)将变化的位置标记为True,再用cumsum()为每个连续相同正负性的片段分配唯一编号。
  3. 生成计数:以group和segment为分组依据,用cumcount()生成从0开始的序号,加1后得到从1开始的连续计数。

输出结果

group  val  count
0     a    2      1
1     a    2      2
2     b    1      1
3     a    2      3
4     b   -3      1
5     b   -3      2
6     a   -7      1
7     a   -5      2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 06:36:32