使用Python phonenumbers库批量验证手机号列时遇报错求助
解决方案
1. 修复批量解析的报错问题
你遇到的NumberParseException是因为批量处理时存在格式异常的手机号(哪怕做了预处理,也可能有隐藏空格、非数字字符等),直接用lambda没有异常捕获会导致整个流程中断。正确做法是写一个带异常处理的解析函数,再用Series的apply批量处理(比DataFrame的apply(axis=1)更高效):
def parse_phone(phone_str): try: # 带+号的国际号码,默认地区设为None即可自动识别 return pn.parse(phone_str, None) except pn.NumberParseException: # 解析失败时返回None,方便后续排查 return None # 批量生成解析后的列 data['Parse Phone'] = data['Phone'].apply(parse_phone)
2. 修复单行调用的错误
data['Phone'][0]是单个字符串,而apply是pandas Series/DataFrame的方法,单个字符串没有这个属性。直接调用解析函数即可:
def parse(n): return pn.parse(n) # 正确用法 num = parse(data['Phone'][0]) print(num)
3. 批量生成验证结果列
针对is_valid_number和is_possible_number,同样用带异常处理的函数批量处理:
def check_valid(phone_num): if phone_num is None: return False try: return pn.is_valid_number(phone_num) except: return False def check_possible(phone_num): if phone_num is None: return False try: return pn.is_possible_number(phone_num) except: return False # 生成验证列 data['Is Valid'] = data['Parse Phone'].apply(check_valid) data['Is Possible'] = data['Parse Phone'].apply(check_possible)
4. 排查异常手机号
如果想找出哪些手机号解析失败,可以筛选出Parse Phone为None的行:
invalid_rows = data[data['Parse Phone'].isna()] print(invalid_rows['Phone'])
常见问题可能是手机号带空格、特殊字符,你可以先做清洗:
# 去掉所有空格 data['Phone'] = data['Phone'].str.replace(r'\s+', '', regex=True) # 检查是否符合+开头加纯数字的格式 invalid_format = data[~data['Phone'].str.match(r'^\+\d+$')] print(invalid_format['Phone'])
内容的提问来源于stack exchange,提问作者runningtrumpet
相关产品推荐
相关产品推荐

