使用pd.read_csv读取csv文件同列手机号部分末尾带.0问题求助
问题原因
CSV属于纯文本文件,本身不存储单元格的格式类型信息。你遇到的带.0后缀问题,是因为手机号列存在空值时,pandas读取阶段会默认将整列推断为float64类型(int类型无法兼容NaN空值),后续即使强制转换为字符串类型,数值形式的手机号就会自动带上.0后缀,空值会转为nan字符串。Excel打开CSV时默认隐藏了数值的小数位,因此你看不到.0后缀。
解决方案
方案1:读取阶段直接清洗(推荐)
使用converters参数在读取文件的同时对手机号列做清洗,从根源避免类型推断导致的格式异常:
import pandas as pd def clean_phone(val): # 空值直接返回空字符串 if pd.isna(val) or str(val).strip() in ('', 'nan'): return '' # 处理float类型的手机号 if isinstance(val, float): return str(int(val)) # 字符串类型的手机号直接去除末尾.0 return val.rstrip('.0') df = pd.read_csv( 'Member_Contact_Info.csv', converters={ 'Priority_Cell': clean_phone, 'Priority_Home': clean_phone } )
方案2:读取完成后批量清洗
适合手机号列较多的场景,统一对所有手机号列做格式修正:
import pandas as pd df = pd.read_csv('Member_Contact_Info.csv', dtype=str) phone_cols = ['Priority_Cell', 'Priority_Home'] for col in phone_cols: # 先替换空值对应的nan字符串,再移除末尾.0 df[col] = df[col].replace('nan', '').str.rstrip('.0')
特殊场景适配
如果你的数据存在开头带0的手机号、固话或海外号码,不要直接转int避免丢失开头的0,使用正则替换处理即可:
df[col] = df[col].replace('nan', '').str.replace(r'\.0$', '', regex=True)
内容的提问来源于stack exchange,提问作者Major-Payne-2000
相关产品推荐
相关产品推荐

