You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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')

常见问题说明

  1. 之前尝试失败的可能原因:

    • 没区分NaN和空字符串:Pandas里的缺失值是NaN,直接转字符串会变成'nan',需要用pd.notna()判断
    • 没加异常捕获:即使字段非空,格式错误的手机号会抛出NumberParseException导致整列处理中断
    • 条件逻辑错误:应该是两个字段都非空才解析,而非“任一非空”(仅一个字段非空时phonenumbers.parse会报错)
  2. 若需要保留解析失败的错误信息,可以把return np.nan改成return "解析失败:{}".format(e)(需要在except里捕获e)

内容的提问来源于stack exchange,提问作者Georgie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:15:57