如何用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值,分组内的首行没有前值,返回NaNx.shift(-1):获取当前行的后一行value值,分组内的末行没有后值,返回NaN(x.shift(1) > x) & (x.shift(-1) > x):逻辑与操作,只有前后值都大于当前值时返回True,否则返回False;首尾行因NaN会得到NaNfillna(False):将首尾行的NaN替换为False,符合需求中首尾行直接返回False的规则
内容的提问来源于stack exchange,提问作者Quinten
相关产品推荐
相关产品推荐

