在Pandas DataFrame中统计各Item的状态转换次数
Pandas状态转换捕获与统计解决方案
问题描述
我正在处理如下所示的Pandas DataFrame:
Items Run Status T1 R1 OK T2 R1 OK T3 R1 OK T4 R1 OK T1 R2 NOK T2 R2 OK T3 R2 NOK T4 R2 OK T1 R3 OK T2 R3 NOK T3 R3 OK T4 R3 OK
希望捕获每个Item的状态转换(OK与NOK之间的相互转换),同时统计每个Item的状态转换次数,最终得到如下格式的结果:
Items Run Status Transition Count of Transition per Items T1 R1 OK 0 1 T1 R2 NOK 1 T1 R3 OK 0 T2 R1 OK 0 1 T2 R2 OK 0 T2 R3 NOK 1 T3 R1 OK 0 2 T3 R2 NOK 1 T3 R3 OK 1 T4 R1 OK 0 0 T4 R2 OK 0 T4 R3 OK 0
实现步骤与代码
核心思路
- 按
Items分组,对比每行与上一行的Status,标记是否发生转换 - 对每组的转换标记求和,得到每个Item的总转换次数,再将结果映射到对应组的所有行
代码实现
import pandas as pd # 构造原始数据 data = { 'Items': ['T1', 'T2', 'T3', 'T4', 'T1', 'T2', 'T3', 'T4', 'T1', 'T2', 'T3', 'T4'], 'Run': ['R1', 'R1', 'R1', 'R1', 'R2', 'R2', 'R2', 'R2', 'R3', 'R3', 'R3', 'R3'], 'Status': ['OK', 'OK', 'OK', 'OK', 'NOK', 'OK', 'NOK', 'OK', 'OK', 'NOK', 'OK', 'OK'] } df = pd.DataFrame(data) # 生成Transition列:对比当前行与上一行状态,不同则标记1,否则0 df['Transition'] = df.groupby('Items')['Status'].apply( lambda x: x.ne(x.shift()).astype(int) ).fillna(0).astype(int) # 统计每个Item的总转换次数,并合并到原表 counts = df.groupby('Items')['Transition'].sum().rename('Count of Transition per Items') df = df.merge(counts, on='Items', how='left') # 调整列顺序匹配目标格式 df = df[['Items', 'Run', 'Status', 'Transition', 'Count of Transition per Items']] # 打印结果 print(df.to_string(index=False))
结果说明
Transition列:1表示当前行相对于同一Item的上一行发生了状态转换,0表示未转换,每组第一行默认标记为0Count of Transition per Items列:对应Item的总转换次数,该Item的所有行显示相同数值
内容的提问来源于stack exchange,提问作者testing22
相关产品推荐
相关产品推荐

