如何用Pandas实现按规则生成依赖前值的grouping列?
高效实现Pandas分组列填充需求
问题背景
现有如下Pandas DataFrame:
| idx | result | grouping |
|---|---|---|
| 1 | False | |
| 2 | True | |
| 3 | True | |
| 4 | False | |
| 5 | True | |
| 6 | True | |
| 7 | True | |
| 8 | False | |
| 9 | True | |
| 10 | True | |
| 11 | True | |
| 12 | True |
需要实现逻辑:
- 当
result为False时,grouping取对应行的idx值 - 当
result为True时,grouping取前一行的grouping值
最终期望结果:
| idx | result | grouping |
|---|---|---|
| 1 | False | 1 |
| 2 | True | 1 |
| 3 | True | 1 |
| 4 | False | 4 |
| 5 | True | 4 |
| 6 | True | 4 |
| 7 | True | 4 |
| 8 | False | 8 |
| 9 | True | 8 |
| 10 | True | 8 |
| 11 | True | 8 |
| 12 | True | 8 |
失败尝试分析
之前尝试的代码存在逻辑或语法问题:
df['grouping'] = df['idx'] if not df['result'] else df['grouping'].shift(1):not df['result']无法对Series做整体布尔判断,需用向量化条件df['grouping'] = df.apply(lambda x: x['idx'] if not x['result'] else x['grouping'].shift(1), axis=1):单行数据的x['grouping']是单个值,无shift方法,且逐行apply效率低下
高效解决方案
使用Pandas的向量化操作实现,避免循环或逐行处理:
import pandas as pd # 构造示例DataFrame data = { 'idx': [1,2,3,4,5,6,7,8,9,10,11,12], 'result': [False,True,True,False,True,True,True,False,True,True,True,True], 'grouping': ['']*12 } df = pd.DataFrame(data) # 核心逻辑:先标记分组锚点,再向前填充 df['grouping'] = df['idx'].where(~df['result']) # result为False时取idx,否则设为NaN df['grouping'] = df['grouping'].ffill() # 向前填充NaN,实现True行继承前一行分组值 df['grouping'] = df['grouping'].astype(int) # 转换为整数类型(按需选择) print(df)
代码说明
df['idx'].where(~df['result']):利用where方法做向量化条件筛选,仅保留result为False行的idx值,其余行设为NaNffill():全称forward fill,将所有NaN值替换为前一个非NaN的值,完美匹配True行继承前一行分组值的需求astype(int):由于填充后的值默认是float类型,可按需转换为整数,保证数据类型符合预期
该方案是Pandas原生的向量化操作,效率远高于循环或apply逐行处理,尤其适合大型数据集。
内容的提问来源于stack exchange,提问作者Mike L
相关产品推荐
相关产品推荐

