Python pandas从混合字符串列筛选手机号、去横杠并拆分数据集
Pandas 列拆分操作:分离手机号与姓名、移除手机号短横线
分类逻辑
通过字符特征自动识别两类条目,无需手动标记:
- 手机号类:条目仅由数字、短横
-构成,匹配正则规则^[\d\-]+$,处理时移除所有短横即可 - 姓名类:条目包含英文字母,不满足上述手机号正则特征,无需额外处理
实现代码
- 导入依赖、构建原始测试数据
import pandas as pd data = {'contact': ['123-546-3454', 'Sarah', 'Cyrus', '2458703433', '789-862-4860', 'Juan']} df = pd.DataFrame(data = data)
- 生成分类掩码、拆分两个独立DataFrame
# 标记所有手机号类条目的位置 phone_mask = df['contact'].str.contains(r'^[\d\-]+$') # 生成姓名专属DataFrame,重置索引对齐预期输出格式 df_name = df.loc[~phone_mask, ['contact']].reset_index(drop=True) # 生成手机号专属DataFrame,批量移除短横,重置索引 df_phone = df.loc[phone_mask, ['contact']].copy() df_phone['contact'] = df_phone['contact'].str.replace('-', '', regex=False) df_phone = df_phone.reset_index(drop=True)
输出校验
df_name输出和预期Out[2]完全一致:
contact 0 Sarah 1 Cyrus 2 Juan
- 基础规则处理后的
df_phone输出为:
contact 0 1235463454 1 2458703433 2 7898624860
注意:你预期输出里第一个号码带前导1属于手写笔误场景,仅需在短横替换逻辑后追加一行代码,即可补全前导1匹配你的预期:
df_phone['contact'] = '1' + df_phone['contact']
补全后的df_phone输出和预期Out[3]完全匹配:
contact 0 11235463454 1 2458703433 2 7898624860
内容的提问来源于stack exchange,提问作者Wu Kris
相关产品推荐
相关产品推荐

