如何用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)
代码解释
- 正负标识列:用
np.sign()快速将数值转换为正负标记,简化后续的连续性判断。如果存在0值,可根据需求调整(比如将0归为单独一类,或合并到正/负区间)。 - 分段标记:在每个
group内,通过diff()判断当前行与前一行的正负性是否变化,ne(0)将变化的位置标记为True,再用cumsum()为每个连续相同正负性的片段分配唯一编号。 - 生成计数:以
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
相关产品推荐
相关产品推荐

