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

Pandas按列分组:最底层节点False值向上传播的高效实现

高效实现Pandas分组修改flag列的需求

给定数据与预处理

首先定义并排序DataFrame:

import pandas as pd
import numpy as np

df = pd.DataFrame({
                   "node": np.repeat([0, 1, 2, 3], 3),
                   "type": np.tile(['A', 'B', 'C'], 4),
                   "flag": [True, True, True, True, True, False, True, True, True, False, True, True]
                  })

df.sort_values(by=['type', 'node'], ascending=True, inplace=True)

排序后的数据如下:

node type flag
0   0   A   True
3   1   A   True
6   2   A   True
9   3   A   False
1   0   B   True
4   1   B   True
7   2   B   True
10  3   B   True
2   0   C   True
5   1   C   False
8   2   C   True
11  3   C   True

需求说明

按type列分组,执行以下逻辑:

  • 若组内存在flag为False的记录:找到组内node值最大的False记录(即组内排序后最靠后的False节点),将组内所有node值小于该节点的记录的flag设为False;
  • 组内无False记录则不做任何处理。

期望结果:

node type flag
0   0   A   False
3   1   A   False
6   2   A   False
9   3   A   False
1   0   B   True
4   1   B   True
7   2   B   True
10  3   B   True
2   0   C   False
5   1   C   False
8   2   C   True
11  3   C   True

当前实现(循环遍历分组)

目前通过for循环遍历分组实现需求,但希望寻求更高效的无循环方案:

gp = df.groupby(['type'])
result_indices = []
for name, group in gp:
    false_index = group[group['flag'] == False].index
    if len(false_index) > 0:
        result_indices.extend(group.index[group.index < false_index[-1]])

df.loc[result_indices, 'flag'] = False

问题

已能提取组内最靠后的False记录的索引,但未找到合适的无循环过滤逻辑,求无需for循环的高效实现方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 19:47:37