如何在Pandas DataFrame中按列变化计数并按双列条件重置
在Pandas DataFrame中按规则生成计数列
需求说明
需要生成Count列,规则如下:
- 当
ColB的值与前一行不同时,计数递增 - 当
ColA和ColB同时为True时,计数重置为1
原始数据
| ColA | ColB | |------|------| | TRUE | TRUE | | FALSE| FALSE| | FALSE| FALSE| | FALSE| FALSE| | FALSE| FALSE| | FALSE| TRUE | | FALSE| FALSE| | FALSE| FALSE| | FALSE| FALSE| | FALSE| TRUE | | FALSE| FALSE| | FALSE| FALSE| | FALSE| FALSE| | FALSE| TRUE | | FALSE| FALSE| | FALSE| FALSE| | TRUE | TRUE | | FALSE| FALSE| | FALSE| FALSE| | FALSE| FALSE|
期望输出
| ColA | ColB | Count| |------|------|------| | TRUE | TRUE | 1 | | FALSE| FALSE| 1 | | FALSE| FALSE| 1 | | FALSE| FALSE| 1 | | FALSE| FALSE| 1 | | FALSE| TRUE | 2 | | FALSE| FALSE| 2 | | FALSE| FALSE| 2 | | FALSE| FALSE| 2 | | FALSE| TRUE | 3 | | FALSE| FALSE| 3 | | FALSE| FALSE| 3 | | FALSE| FALSE| 3 | | FALSE| TRUE | 4 | | FALSE| FALSE| 4 | | FALSE| FALSE| 4 | | TRUE | TRUE | 1 | | FALSE| FALSE| 1 | | FALSE| FALSE| 1 | | FALSE| FALSE| 1 |
解决方案
实现代码
import pandas as pd # 构造示例数据 data = { 'ColA': [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False], 'ColB': [True, False, False, False, False, True, False, False, False, True, False, False, False, True, False, False, True, False, False, False] } df = pd.DataFrame(data) # 1. 创建重置标记:ColA和ColB同时为True时标记为1 reset_flag = (df['ColA'] & df['ColB']).astype(int) # 2. 生成分组键,每个重置点开启新分组 group_key = reset_flag.cumsum() # 3. 分组内计算计数:ColB与前一行不同则递增,初始为1 df['Count'] = df.groupby(group_key)['ColB'].apply( lambda x: (x != x.shift()).cumsum().fillna(1).astype(int) ) print(df)
代码解释
- 重置标记与分组:
reset_flag标记所有需要重置计数的行,通过cumsum()生成group_key,将DataFrame划分为多个独立的分组,每个分组从重置行开始。 - 分组内计数逻辑:对每个分组的
ColB列,比较当前行与前一行的值是否不同(x != x.shift()),将差异值累加得到计数。分组第一行没有前一行,用fillna(1)确保初始计数为1。
内容的提问来源于stack exchange,提问作者Kamel Alami
相关产品推荐
相关产品推荐

