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

Pandas遍历DataFrame时如何提取值为6的行上方最后一个值为2的行

实现方案

核心思路

  • 先对DataFrame的c2列做连续相同值分组,区分出连续的2块和连续的6块
  • 筛选出「值为2、且下一个相邻分组的值为6」的分组
  • 取上述每个符合条件的分组的最后一行,就是你要的结果

完整实现代码

import pandas as pd
data = [{'c1':'a', 'c2':2}, {'c1':'b','c2':2}, {'c1':'c','c2':6},{'c1':'d','c2':6},{'c1':'e','c2':2},{'c1':'c','c2':6}]
df = pd.DataFrame(data)

# 生成连续相同值的分组标签
df['group_id'] = (df['c2'] != df['c2'].shift()).cumsum()
# 统计每个分组的c2值和下一个分组的c2值
group_info = df.groupby('group_id')['c2'].first().reset_index(name='c2_val')
group_info['next_c2_val'] = group_info['c2_val'].shift(-1)
# 筛选出符合条件的分组id:当前分组c2=2,下一分组c2=6
target_group_ids = group_info[(group_info['c2_val'] == 2) & (group_info['next_c2_val'] == 6)]['group_id']
# 取每个目标分组的最后一行
result = df[df['group_id'].isin(target_group_ids)].groupby('group_id').last().reset_index(drop=True)
# 删掉辅助列
result = result.drop('group_id', axis=1)
print(result)

输出结果

c1  c2
0  b   2
1  e   2

补充说明

你之前的认知有误,shift方法本身是支持作用于整个DataFrame的,只是这个场景我们只需要对单列做偏移处理即可,不需要操作全表。如果你的业务逻辑有调整,也可以直接对整个DF调用df.shift(1)获取全表偏移一行的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:54:03