Pandas状态转换计数:修正单个实例的异常结果
解决单条记录Item的状态转换统计错误问题
问题描述
现有如下DataFrame,需要统计每个Item的OK/NOK状态转换次数:
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
使用以下代码实现统计:
# sort values by Items and Run df = df.sort_values(by=['Items', 'Run']) # identify changes in Status m = df['Status'].ne(df.groupby('Items')['Status'].shift().bfill()) # convert boolean to integer df['Transition'] = m.astype(int) # count per group masking the non-first values with empty string df['Count'] = (m.groupby(df['Items']).transform('sum') .mask(df['Items'].duplicated(), '') # optional )
正常多Run记录的Item统计结果符合预期,但当DataFrame中出现仅含单个Run记录的Item(如T5)时,代码会错误地将其Transition设为1、Count设为1,而期望结果是这两个值均为0:
Items Run Status Transition Count 0 T1 R1 OK 0 2 4 T1 R2 NOK 1 8 T1 R3 OK 1 1 T2 R1 OK 0 1 5 T2 R2 OK 0 9 T2 R3 NOK 1 2 T3 R1 OK 0 2 6 T3 R2 NOK 1 10 T3 R3 OK 1 3 T4 R1 OK 0 0 7 T4 R2 OK 0 11 T4 R3 OK 0 XX T5 R1 OK 1 1
问题原因
原代码中,当Item只有单条记录时,df.groupby('Items')['Status'].shift()会返回NaN,后续的bfill()无法填充(因为分组内只有一行),导致df['Status'].ne(NaN)返回True,最终Transition被转为1,统计求和后Count为1,不符合需求。
修正方案
先计算每个Item分组的记录数量,对于只有单条记录的分组,直接将Transition设为0,Count设为0;对于多记录的分组,保留原逻辑判断状态转换。
修正后的完整代码:
# 按Items和Run排序 df = df.sort_values(by=['Items', 'Run']) # 计算每个Item分组的记录数 group_size = df.groupby('Items')['Status'].transform('size') # 判断状态转换:仅当分组记录数>1时,才对比前后状态;否则设为False m = df['Status'].ne(df.groupby('Items')['Status'].shift()) & (group_size > 1) # 转换为整数类型 df['Transition'] = m.astype(int) # 统计每个Item的转换次数,单条记录的Item设为0,同时隐藏重复行的Count值 df['Count'] = (m.groupby(df['Items']).transform('sum') .mask(df['Items'].duplicated(), '') # 可选:隐藏重复行的Count .mask(group_size == 1, 0) # 单条记录的Item,Count设为0 )
修正后结果
运行修正代码后,T5的Transition和Count均为0,符合预期:
Items Run Status Transition Count 0 T1 R1 OK 0 2 4 T1 R2 NOK 1 8 T1 R3 OK 1 1 T2 R1 OK 0 1 5 T2 R2 OK 0 9 T2 R3 NOK 1 2 T3 R1 OK 0 2 6 T3 R2 NOK 1 10 T3 R3 OK 1 3 T4 R1 OK 0 0 7 T4 R2 OK 0 11 T4 R3 OK 0 XX T5 R1 OK 0 0
内容的提问来源于stack exchange,提问作者testing22
相关产品推荐
相关产品推荐

