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

