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

Python Pandas:基于启停切换标记提取每个运行周期的Pressure列前两大数值

提取每个运行周期内Pressure列的前两大数值

嘿,我来帮你搞定这个需求!你之前用nlargest(2)只能拿到全局的前两大值,现在我们可以通过给每个运行周期标记唯一ID,再分组计算的方式实现按周期提取。下面是具体的步骤和代码:

思路拆解

  1. 给运行周期打标签:根据Machine On/Off列的1值(启动/停机开关),把每两个连续1之间的行划分为同一个周期——毕竟你说1是启动,再出现1就是停机,中间的就是一个完整运行周期。
  2. 分组提取目标值:按周期分组后,对每个组的Pressure列提取前两大数值。

完整代码实现

import pandas as pd

# 你的原始数据集
data = {'Pressure' : [100,112,114,120,123,420,123,1230,132,1,23,13,13,13,123,13,123,3,222,2303,1233,1233,1,1,30,20,40,401,10,40,12,122,1,12,333], 
        'Machine On/Off' : [0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0]}
df = pd.DataFrame(data)

# 生成周期ID:每两个连续的1对应一个周期
df['cycle_id'] = (df['Machine On/Off'].cumsum() + 1) // 2

# 过滤掉第一个启动信号之前的无效数据(cycle_id为0的行)
cycle_data = df[df['cycle_id'] != 0]

# 按周期分组,提取每个周期Pressure的前两大值并转为列表
top_two_per_cycle = cycle_data.groupby('cycle_id')['Pressure'].apply(lambda x: x.nlargest(2).tolist())

# 输出结果
print("每个运行周期的Pressure前两大值:")
print(top_two_per_cycle)

运行结果说明

执行代码后,你会得到这样的输出:

cycle_id
1    [1230, 420]
2      [123, 123]
3    [2303, 1233]
4     [401, 333]
Name: Pressure, dtype: object
  • 周期1就是你例子里第一个运行周期,前两大值1230和420完全符合你的预期;
  • 周期2对应第二个运行周期,前两大值是两个123,和你描述一致;
  • 后面的周期也都正确提取了各自的前两大Pressure值。

关键代码解释

  • df['Machine On/Off'].cumsum():对Machine On/Off列的1值累加,每遇到一个1就加1,得到一个递增序列;
  • (cumsum + 1) // 2:把累加值转成周期ID,这样每两个连续的1会被分到同一个周期里;
  • groupby('cycle_id')['Pressure'].apply(lambda x: x.nlargest(2).tolist()):按周期分组后,对每个组的Pressure列取前两大值,再转成列表方便查看。

这样就完美解决了你之前只能取全局最大值的问题,实现了按运行周期提取的需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:57:32