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
相关产品推荐
相关产品推荐

