如何用Python Pandas根据VALUE列生成机器运行模式statusA/B列?
解决方案:用Pandas结合状态机生成运行模式列
问题规则回顾
- 初始模式为A
- 切换到模式B的条件:连续3个时间步的
VALUE≥5(即连续3个on状态) - 进入模式B后:
- 只要后续
VALUE≥5(on状态),保持模式B - 若出现
VALUE<5(down状态),需连续3个down时间步后才切换回A;期间若再次出现on,重置down计数并保持B
- 只要后续
实现代码
import pandas as pd # 1. 创建示例数据(可替换为你的实际DataFrame) data = { 'time': ['00:00', '00:01', '00:02', '00:03', '00:04', '00:05', '00:06', '00:07', '00:08', '00:08', '00:09', '00:10', '00:11', '00:12', '00:13', '00:14', '00:15', '00:16', '00:17', '00:18', '00:19', '00:20', '00:21', '00:22', '00:23', '00:24', '00:25'], 'VALUE': [0,0,0,8,4,2,1,2,1,5,6,0,10,10,10,11,2,1,3,11,10,10,10,10,11,14,11] } df = pd.DataFrame(data) # 2. 定义状态机逻辑函数 def update_status(row, prev_state, consecutive_on, down_count): current_is_on = row['VALUE'] >= 5 if prev_state == 'A': # 更新连续on次数:当前是on则累加,否则重置为0 consecutive_on = consecutive_on + 1 if current_is_on else 0 # 连续on满3次则切换到B if consecutive_on >= 3: new_state = 'B' down_count = 0 else: new_state = 'A' else: # 处于B状态 if current_is_on: # 当前是on,保持B并重置down计数 new_state = 'B' consecutive_on += 1 down_count = 0 else: # 当前是down,累加down计数 down_count += 1 # 连续down满3次则切回A,否则保持B new_state = 'A' if down_count >= 3 else 'B' # 切回A时重置连续on计数 if new_state == 'A': consecutive_on = 0 return new_state, consecutive_on, down_count # 3. 初始化状态变量并遍历DataFrame生成结果 prev_state = 'A' consecutive_on = 0 down_count = 0 status_list = [] for _, row in df.iterrows(): new_state, consecutive_on, down_count = update_status(row, prev_state, consecutive_on, down_count) status_list.append(new_state) prev_state = new_state # 4. 将结果添加到DataFrame,并生成on/down状态列 df['status_on_down'] = df['VALUE'].apply(lambda x: 'on' if x >=5 else 'down') df['statusA/B'] = status_list # 查看最终结果 print(df[['time', 'VALUE', 'status_on_down', 'statusA/B']])
代码说明
- 状态机核心:通过跟踪
prev_state(当前模式)、consecutive_on(连续on次数)、down_count(B状态下连续down次数)三个变量,逐行判断模式切换逻辑 - A状态逻辑:仅在连续3次on时触发切换到B,否则保持A
- B状态逻辑:on时维持B并重置down计数;down时累加计数,满3次切回A,期间若出现on则重置计数继续保持B
验证结果
运行代码后生成的statusA/B列与示例数据完全匹配,满足所有规则要求。
内容的提问来源于stack exchange,提问作者jess
相关产品推荐
相关产品推荐

