如何在Pandas中保留满足条件的连续行组的最后一条记录?
解决方案
可以通过以下步骤实现你的需求:
- 标记flag相等的行:创建布尔列区分
flag_1与flag_2是否相等的行 - 对连续行分组:利用状态变化生成连续行的分组标识
- 分组筛选数据: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()生成唯一分组IDgroupby('group_id').apply(...):对每个分组执行逻辑:若分组为flag相等类型,用tail(1)取最后一行(因index递增,最后一行即index最大的行);否则保留整个分组的所有行
内容的提问来源于stack exchange,提问作者VSP
相关产品推荐
相关产品推荐

