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
相关产品推荐
相关产品推荐

