如何用Pandas按累计值归零区间分组并设置组标识?
解决方案
直接上步骤和代码,每步说明逻辑:
- 计算累计值
先算出col2的累计和,得到cumvalue列,这是分组的核心依据:
import pandas as pd # 初始化数据 d = {'col1': [1, 2, 3, 4, 5, 6,7,8], 'col2': [10, 1, -1, -10, 5, 1,-6,5] } df = pd.DataFrame(d) # 计算累计值 df['cumvalue'] = df['col2'].cumsum()
- 生成分组标识
我们需要把「累计值从0脱离到再次归零」的行划分为一组,先标记每个组的起始行:
- 当累计值为0,且下一行累计值不为0时,下一行是新组的起点
- 第一行如果累计值不为0,直接作为第一个组的起点
然后通过cumsum()生成连续的组号:
# 标记分组起始行 start_rows = (df['cumvalue'] == 0) & (df['cumvalue'].shift(-1) != 0) # 处理第一行的特殊情况 start_rows.iloc[0] = start_rows.iloc[0] | (df['cumvalue'].iloc[0] != 0) # 生成组号 df['group'] = start_rows.cumsum()
- 统一替换每组col1值
用groupby结合transform('first'),把每组的col1替换成组内第一行的col1值:
# 替换col1为每组第一个值 df['col1'] = df.groupby('group')['col1'].transform('first')
- 整理结果(可选)
如果不需要group列,可以删掉:
df = df.drop('group', axis=1)
最终输出和期望一致:
col1 col2 cumvalue 0 1 10 10 1 1 1 11 2 1 -1 10 3 1 -10 0 4 2 5 5 5 2 1 6 6 2 -6 0 7 3 5 5
内容的提问来源于stack exchange,提问作者Nekodas
相关产品推荐
相关产品推荐

