Python Pandas:基于启停切换标记提取每个运行周期的Pressure列前两大数值
提取每个运行周期内Pressure列的前两大数值
嘿,我来帮你搞定这个需求!你之前用nlargest(2)只能拿到全局的前两大值,现在我们可以通过给每个运行周期标记唯一ID,再分组计算的方式实现按周期提取。下面是具体的步骤和代码:
思路拆解
- 给运行周期打标签:根据
Machine On/Off列的1值(启动/停机开关),把每两个连续1之间的行划分为同一个周期——毕竟你说1是启动,再出现1就是停机,中间的就是一个完整运行周期。 - 分组提取目标值:按周期分组后,对每个组的
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
相关产品推荐
相关产品推荐

