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

如何用Pandas检查分组中每个值的前后值是否均更高

Pandas实现分组检查前后值是否均大于当前值

需求说明

按分组检查每个value的前一个值和后一个值是否均大于当前值:

  • 若前后值都大于当前值,新列class返回True
  • 否则返回False(首尾行因缺少前/后值,直接返回False)

示例原始数据

import pandas as pd

data = [['A', '2022-09-01', 2], ['A', '2022-09-02', 1], ['A', '2022-09-03', 1.5], ['A', '2022-09-04', 1.5],
        ['A', '2022-09-05', 1], ['A', '2022-09-06', 1], ['A', '2022-09-07', 0.5], ['A', '2022-09-08', 1],
        ['B', '2022-09-01', 3], ['B', '2022-09-02', 2], ['B', '2022-09-03', 1], ['B', '2022-09-04', 2],
        ['B', '2022-09-05', 1], ['B', '2022-09-06', 0.5], ['B', '2022-09-07', 1.2], ['B', '2022-09-08', 1.2]]
df = pd.DataFrame(data=data, columns=['group', 'date', 'value'])

输出的原始DataFrame:

group        date  value
0      A  2022-09-01    2.0
1      A  2022-09-02    1.0
2      A  2022-09-03    1.5
3      A  2022-09-04    1.5
4      A  2022-09-05    1.0
5      A  2022-09-06    1.0
6      A  2022-09-07    0.5
7      A  2022-09-08    1.0
8      B  2022-09-01    3.0
9      B  2022-09-02    2.0
10     B  2022-09-03    1.0
11     B  2022-09-04    2.0
12     B  2022-09-05    1.0
13     B  2022-09-06    0.5
14     B  2022-09-07    1.2
15     B  2022-09-08    1.2

期望输出

data = [['A', '2022-09-01', 2, False], ['A', '2022-09-02', 1, True], ['A', '2022-09-03', 1.5, False], ['A', '2022-09-04', 1.5, False],
        ['A', '2022-09-05', 1, False], ['A', '2022-09-06', 1, False], ['A', '2022-09-07', 0.5, True], ['A', '2022-09-08', 1, False],
        ['B', '2022-09-01', 3, False], ['B', '2022-09-02', 2, False], ['B', '2022-09-03', 1, True], ['B', '2022-09-04', 2, False],
        ['B', '2022-09-05', 1, False], ['B', '2022-09-06', 0.5, True], ['B', '2022-09-07', 1.2, False], ['B', '2022-09-08', 1.2, False]]
df_desired = pd.DataFrame(data=data, columns=['group', 'date', 'value', 'class'])

对应的DataFrame:

group        date  value  class
0      A  2022-09-01    2.0  False
1      A  2022-09-02    1.0   True
2      A  2022-09-03    1.5  False
3      A  2022-09-04    1.5  False
4      A  2022-09-05    1.0  False
5      A  2022-09-06    1.0  False
6      A  2022-09-07    0.5   True
7      A  2022-09-08    1.0  False
8      B  2022-09-01    3.0  False
9      B  2022-09-02    2.0  False
10     B  2022-09-03    1.0   True
11     B  2022-09-04    2.0  False
12     B  2022-09-05    1.0  False
13     B  2022-09-06    0.5   True
14     B  2022-09-07    1.2  False
15     B  2022-09-08    1.2  False

实现代码

# 基于原始df添加class列
df['class'] = df.groupby('group')['value'].apply(
    lambda x: (x.shift(1) > x) & (x.shift(-1) > x)
).fillna(False)

代码解释

  • groupby('group')['value']:按group字段分组,只对value列进行后续操作
  • x.shift(1):获取当前行的前一行value值,分组内的首行没有前值,返回NaN
  • x.shift(-1):获取当前行的后一行value值,分组内的末行没有后值,返回NaN
  • (x.shift(1) > x) & (x.shift(-1) > x):逻辑与操作,只有前后值都大于当前值时返回True,否则返回False;首尾行因NaN会得到NaN
  • fillna(False):将首尾行的NaN替换为False,符合需求中首尾行直接返回False的规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:31:02