使用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)
示例输出:
| none | none |
|---|---|
| 1 | none |
| 2 | none |
错误原因
- 直接修改全局DataFrame导致整列覆盖:函数
phone_valid里直接对df_phone的列赋值,这会把整列都改成当前行的处理结果,而非仅修改当前行。 - 函数无返回值导致apply生成全None的DataFrame:
apply()会将函数的返回值作为新行数据,你的函数未返回任何内容,默认返回None,最终df_phone被替换成全是None的结构。 - 异常处理不完整:异常分支里未给
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
相关产品推荐
相关产品推荐

