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

如何在Pandas中保留满足条件的连续行组的最后一条记录?

解决方案

可以通过以下步骤实现你的需求:

  1. 标记flag相等的行:创建布尔列区分flag_1与flag_2是否相等的行
  2. 对连续行分组:利用状态变化生成连续行的分组标识
  3. 分组筛选数据:flag相等的组仅保留index最大的行,不相等的组保留全部行

具体代码如下:

import pandas as pd

d = {'value': [1,1,1,1,1,1,1,1,1,1], 
     'flag_1': [0,1,0,1,1,1,0,1,1,1],
     'flag_2':[1,0,1,1,1,1,1,0,1,1],
     'index':[1,2,3,4,5,6,7,8,9,10]}
df = pd.DataFrame(data=d)

# 1. 标记flag相等的行
df['flag_equal'] = df['flag_1'] == df['flag_2']

# 2. 生成连续行的分组键:flag_equal状态变化时分组编号递增
df['group_id'] = df['flag_equal'].ne(df['flag_equal'].shift()).cumsum()

# 3. 分组处理:相等组取最后一行(index最大),不相等组保留全部
result = df.groupby('group_id').apply(
    lambda x: x.tail(1) if x['flag_equal'].iloc[0] else x
).reset_index(drop=True)

# 移除辅助列(可选)
result = result.drop(columns=['flag_equal', 'group_id'])

print(result)

执行后输出结果:

value  flag_1  flag_2  index
0      1       0       1      1
1      1       1       0      2
2      1       0       1      3
3      1       1       1      6
4      1       0       1      7
5      1       1       0      8
6      1       1       1     10

代码说明

  • df['flag_equal'] = df['flag_1'] == df['flag_2']:直接比较两列生成布尔值,True表示flag相等
  • df['flag_equal'].ne(df['flag_equal'].shift()):判断当前行与上一行的flag_equal状态是否变化,变化则返回True,再通过cumsum()生成唯一分组ID
  • groupby('group_id').apply(...):对每个分组执行逻辑:若分组为flag相等类型,用tail(1)取最后一行(因index递增,最后一行即index最大的行);否则保留整个分组的所有行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 18:58:32