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

pandas如何对DataFrame连续True序列分组编号,False行标注为None

正确实现代码

import pandas as pd

df = pd.DataFrame({"val_a":[True,True,False,False,False,True,False,False,True,True,True,True,False,True,True]})
# 标记每段连续True的起始位置
start_mask = df['val_a'] & ~df['val_a'].shift(fill_value=False)
# 对起始位置累加得到分组ID,调整编号从0开始
df['tx'] = start_mask.cumsum() - 1
# 所有val_a为False的行tx设置为None
df.loc[~df['val_a'], 'tx'] = None

# 可选:如果需要显式的Python None而非pandas可空类型,可加以下代码
# df['tx'] = df['tx'].astype('Int64').replace({pd.NA: None})

实现逻辑说明

  • start_mask的作用是识别连续True块的第一个位置:判定规则为当前值为True,且前一个值为False,首行默认前一个值为False,适配首行是True的场景
  • 对start_mask做累加计算,每遇到一个新的连续True块累加值+1,减1操作是为了让首个分组编号从0开始,匹配需求
  • 最后统一把val_a为False的行的tx字段置为None即可

原代码问题说明

你之前的实现是对所有True逐行累加,会把连续的True拆分为不同的独立分组,所以无法得到连续True共用同一个tx编号的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 07:54:02