Python Pandas实现字符串列校验计算与不符合规则行筛选
Pandas实现校验位筛选方案
实现思路
- 先对
col1列做异常兼容:NaN、长度不等于11、含非数字字符的值,直接判定为不符合校验要求 - 对符合11位纯数字格式的值,按照给定算法计算校验位,和实际最后一位比对
- 按筛选条件过滤行即可得到目标结果
完整实现代码
import pandas as pd import numpy as np # 示例数据(可替换为实际DataFrame) df = pd.DataFrame({ 'col1': ['46081402525', '77020220486', '1233GGdP', np.nan] }) # 固定权重顺序,对应前10位数字从左到右的权重值 weights = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3] def check_valid(s): # 空值直接判定为不合法 if pd.isna(s): return False # 长度不是11直接判定为不合法 if len(s) != 11: return False # 含非数字字符直接判定为不合法 if not s.isdigit(): return False # 取前10位转整数列表 front_digits = [int(c) for c in s[:-1]] # 计算所有乘积的个位数之和 sum_unit = 0 for d, w in zip(front_digits, weights): sum_unit += (d * w) % 10 # 计算期望校验位,兼容和个位为0时校验位为0的边界场景 expected_check = (10 - sum_unit % 10) % 10 actual_check = int(s[-1]) return expected_check == actual_check # 筛选校验通过的行,和示例输出一致 valid_mask = df['col1'].apply(check_valid) result = df[valid_mask] print(result)
结果说明
运行代码输出和预期完全匹配:
col1 1 77020220486
如果需要筛选不满足规则的行,把筛选条件改为df[~valid_mask]即可,会返回校验失败、含非数字字符、空值的所有行。
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

