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

使用Pandas Apply处理含空值DataFrame时结果全为None的问题排查

问题描述

尝试用phonenumbers库清洗电话号码,编写函数提取国家码、国内号码并验证有效性,将结果存入country_code、national_number和valid列。选择用apply()而非循环处理含噪声号码的DataFrame,但执行后df_phone全为None值。

代码如下:

import phonenumbers
import pandas as pd
df_phone = pd.read_csv(r'D:\Code\Address-Nominatim\Address-Nominatim\Phone_Valid.csv',encoding='utf8')
df_phone['country_code'] = ''
df_phone['national_number'] = ''
df_phone['valid']='' 

def phone_valid(phone):
    try:
        #print(phone['PHONE'] + " " + phone['COUNTRY'])
        x = phonenumbers.parse(phone['PHONE'],phone['COUNTRY'])
        df_phone['country_code'] = x.country_code
        df_phone['national_number'] = x.national_number
        df_phone['valid']=phonenumbers.is_possible_number(x)
    except:
        df_phone['country_code'] = "Error"
        df_phone['national_number'] = "Error"


df_phone=df_phone.apply(phone_valid,axis=1)

print(df_phone)

示例输出:

nonenone
1none
2none
错误原因
  1. 直接修改全局DataFrame导致整列覆盖:函数phone_valid里直接对df_phone的列赋值,这会把整列都改成当前行的处理结果,而非仅修改当前行。
  2. 函数无返回值导致apply生成全None的DataFrame:apply()会将函数的返回值作为新行数据,你的函数未返回任何内容,默认返回None,最终df_phone被替换成全是None的结构。
  3. 异常处理不完整:异常分支里未给valid列赋值,会导致该列数据缺失。
修正后的代码
import phonenumbers
import pandas as pd

df_phone = pd.read_csv(r'D:\Code\Address-Nominatim\Address-Nominatim\Phone_Valid.csv', encoding='utf8')
df_phone['country_code'] = ''
df_phone['national_number'] = ''
df_phone['valid'] = '' 

def phone_valid(row):
    try:
        parsed_num = phonenumbers.parse(row['PHONE'], row['COUNTRY'])
        row['country_code'] = parsed_num.country_code
        row['national_number'] = parsed_num.national_number
        row['valid'] = phonenumbers.is_possible_number(parsed_num)
    except Exception as e:
        row['country_code'] = "Error"
        row['national_number'] = "Error"
        row['valid'] = False  # 验证失败标记为False
    return row  # 返回处理后的行

df_phone = df_phone.apply(phone_valid, axis=1)
print(df_phone)
关键修改点
  • 函数接收单个行数据,修改当前行的列值后返回该行,让apply()能正确生成新的DataFrame。
  • 异常处理中补充valid列的赋值,保证数据完整性。
  • 避免直接修改全局DataFrame,改为操作传入的行对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:09:24