Pandas实现DataFrame按行右向首位有效值统计已验证条目数量
实现方案
实现思路
- 首先调整TST列的顺序为从右到左(TST5到TST1),匹配从右向左遍历的规则
- 逐行过滤空值后取第一个非空值,判断是否为合法数值
- 再校验第一个合法数值左侧的所有非空值中是否存在无效状态,不存在则判定为已验证
代码实现
import pandas as pd # 定义规则常量 INVALID_STATES = {'NOT_DONE', 'INCOMP', 'UNTESTED'} VALID_NUMS = {'30', '35', '40', '45', '50'} # 按从右到左的顺序定义TST列 TST_COLS = ['TST5', 'TST4', 'TST3', 'TST2', 'TST1'] def check_row_valid(row): # 过滤空值和空字符串 non_empty_vals = [] for val in row: if pd.notna(val): val_str = str(val).strip() if val_str: non_empty_vals.append(val_str) # 全为空直接返回不合法 if not non_empty_vals: return False first_val = non_empty_vals[0] # 第一个非空值不是合法数值 if first_val not in VALID_NUMS: return False # 检查左侧是否存在无效状态 for left_val in non_empty_vals[1:]: if left_val in INVALID_STATES: return False return True # 生成合法行判断列 df['is_validated'] = df[TST_COLS].apply(check_row_valid, axis=1) # 统计结果 total_valid = df['is_validated'].sum() group_a_valid = df[df['is_validated']]['Group'].value_counts().get('A', 0) group_b_valid = df[df['is_validated']]['Group'].value_counts().get('B', 0) # 打印结果 print "Number of validated items: ", total_valid print "Number of group A validated items: ", group_a_valid print "Number of group B validated items: ", group_b_valid
代码说明
- 兼容Python2.7和pandas0.24.2版本语法,没有使用高版本新增API
- 对空值和空字符串都做了兼容处理,避免原始数据中空格等异常
- 遍历逻辑完全匹配需求中的从右向左遍历、优先取首位有效值、校验左侧无效状态的规则,运行后可直接得到预期输出结果
内容的提问来源于stack exchange,提问作者coding amat
相关产品推荐
相关产品推荐

