如何在Pandas DataFrame中统计布尔列连续True/False生成正负计数列
解决方案
你之前的代码只能统计True的累计值,是因为用(~mask).cumsum()作为分组键仅能对连续True做正确分组,无法处理连续False的分组识别,也没有加入符号判断逻辑。正确实现方式如下:
完整代码示例
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'Mask': [True, True, True, False, False, True, False, False] }) # 生成连续相同值的分组ID group_key = df['Mask'].ne(df['Mask'].shift()).cumsum() # 按分组计算带符号的组长度,映射到每一行 df['Count'] = df.groupby(group_key)['Mask'].transform( lambda x: len(x) if x.iloc[0] else -len(x) )
运行后得到的df就是你需要的预期结果:
| Mask | Count |
|---|---|
| True | 3 |
| True | 3 |
| True | 3 |
| False | -2 |
| False | -2 |
| True | 1 |
| False | -2 |
| False | -2 |
逻辑说明
df['Mask'].ne(df['Mask'].shift()):逐行对比当前行和上一行的Mask值是否不同,不同返回True,相同返回False- 对上述结果做
cumsum()累加,每遇到一个新分组(返回True)就累加1,最终所有连续相同值的行会拿到同一个分组ID - 按分组ID做
groupby后,用transform计算每个组的长度,再根据组内第一个Mask的值判断符号:True组返回正长度,False组返回负长度,transform会自动把组计算结果映射到组内的每一行,直接生成目标Count列
内容的提问来源于stack exchange,提问作者RazzleDazzle
相关产品推荐
相关产品推荐

