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

如何用Pandas实现按规则生成依赖前值的grouping列?

高效实现Pandas分组列填充需求

问题背景

现有如下Pandas DataFrame:

idxresultgrouping
1False
2True
3True
4False
5True
6True
7True
8False
9True
10True
11True
12True

需要实现逻辑:

  • 当result为False时,grouping取对应行的idx值
  • 当result为True时,grouping取前一行的grouping值

最终期望结果:

idxresultgrouping
1False1
2True1
3True1
4False4
5True4
6True4
7True4
8False8
9True8
10True8
11True8
12True8

失败尝试分析

之前尝试的代码存在逻辑或语法问题:

  • 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)

代码说明

  1. df['idx'].where(~df['result']):利用where方法做向量化条件筛选,仅保留result为False行的idx值,其余行设为NaN
  2. ffill():全称forward fill,将所有NaN值替换为前一个非NaN的值,完美匹配True行继承前一行分组值的需求
  3. astype(int):由于填充后的值默认是float类型,可按需转换为整数,保证数据类型符合预期

该方案是Pandas原生的向量化操作,效率远高于循环或apply逐行处理,尤其适合大型数据集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:55:15