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

为DataFrame添加按continuity重置的连续group=1分组ID列

解决DataFrame生成group_id列的需求

嘿,这个需求很明确,咱们用Pandas一步步搞定它!先理清楚核心规则:

  • 只要group列是0,group_id直接设为0;
  • 连续的group=1行要标同一个整数ID;
  • 关键:每当continuity为0时,后续的group=1连续组要从1重新开始编号,之后再依次递增。

下面是具体实现代码,我会逐行解释逻辑:

import pandas as pd

# 先假设你的DataFrame已经存在,这里用示例数据演示
data = {
    'continuity': [1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1],
    'group': [0,1,1,1,0,1,1,1,0,0,1,1,0,1,1,0,0,1,1]
}
df = pd.DataFrame(data)

# 步骤1:标记重置区间——每次continuity=0时,开启一个新的计数区间
df['reset_interval'] = (df['continuity'] == 0).cumsum()

# 步骤2:识别所有连续的group块,只保留group=1的块编号,其他设为缺失值
df['block'] = (df['group'] != df['group'].shift()).cumsum()
df['block'] = df['block'].where(df['group'] == 1, pd.NA)

# 步骤3:在每个重置区间内,对group=1的块分配从1开始的递增ID,group=0的填充为0
df['group_id'] = df.groupby('reset_interval')['block'].rank(method='dense').fillna(0).astype(int)

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

# 查看结果
print(df)

代码逻辑解释

  • 步骤1:(df['continuity'] == 0).cumsum()生成递增的区间编号,每遇到continuity=0的行就加1,把数据划分为多个独立的"重置区间",每个区间内的group=1组ID从1重新计数。
  • 步骤2:(df['group'] != df['group'].shift()).cumsum()识别连续的同值块:当当前行group与上一行不同时,编号递增,确保每个连续的group=1/group=0块有唯一标识。再通过where过滤掉group=0的块编号,只保留需要计数的部分。
  • 步骤3:按重置区间分组后,用rank(method='dense')为每个区间内的group=1块生成连续递增的ID,最后将group=0对应的缺失值填充为0并转为整数,得到最终的group_id列。

运行后得到的结果完全符合你给出的示例要求!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:04:43