如何在Pandas DataFrame中使用phonenumbers库处理非完整手机号字段
解决方案:Pandas 条件解析手机号字段
核心思路
只对Phone和CountryCode均非空且非空白字符串的行执行解析,同时捕获解析失败的异常(比如格式错误的手机号),避免整列处理中断。
方法1:自定义解析函数(推荐,可读性高)
把解析逻辑封装成单独函数,方便维护和异常处理:
import phonenumbers import pandas as pd import numpy as np def parse_phone(row): # 提取字段并处理空白 phone = str(row['Phone']).strip() if pd.notna(row['Phone']) else '' country_code = str(row['CountryCode']).strip() if pd.notna(row['CountryCode']) else '' # 仅当两个字段都非空时尝试解析 if phone and country_code: try: return phonenumbers.parse(phone, country_code) except phonenumbers.NumberParseException: # 解析失败时返回NaN,也可以自定义标记比如"无效号码" return np.nan return np.nan # 应用到DataFrame df['Test phone'] = df.apply(parse_phone, axis='columns')
方法2:用loc筛选批量处理
先初始化目标列为空,再筛选符合条件的行单独处理:
import phonenumbers import pandas as pd import numpy as np # 初始化目标列为NaN df['Test phone'] = np.nan # 构建筛选条件:两个字段都非空且非空白 mask = (pd.notna(df['Phone']) & pd.notna(df['CountryCode']) & (df['Phone'].astype(str).str.strip() != '') & (df['CountryCode'].astype(str).str.strip() != '')) # 仅对符合条件的行执行解析,加入异常捕获 def safe_parse(phone, country_code): try: return phonenumbers.parse(str(phone).strip(), str(country_code).strip()) except phonenumbers.NumberParseException: return np.nan df.loc[mask, 'Test phone'] = df.loc[mask].apply(lambda x: safe_parse(x['Phone'], x['CountryCode']), axis='columns')
常见问题说明
之前尝试失败的可能原因:
- 没区分
NaN和空字符串:Pandas里的缺失值是NaN,直接转字符串会变成'nan',需要用pd.notna()判断 - 没加异常捕获:即使字段非空,格式错误的手机号会抛出
NumberParseException导致整列处理中断 - 条件逻辑错误:应该是两个字段都非空才解析,而非“任一非空”(仅一个字段非空时
phonenumbers.parse会报错)
- 没区分
若需要保留解析失败的错误信息,可以把
return np.nan改成return "解析失败:{}".format(e)(需要在except里捕获e)
内容的提问来源于stack exchange,提问作者Georgie
相关产品推荐
相关产品推荐

