如何清洗Pandas DataFrame中含Phone的列,保留纯数字格式?
修正方案及代码优化
先指出你原代码的几个问题:
- 循环里写
df['col']是硬编码取名为col的列,不是遍历的目标列变量,得改成df[col] df.['col']多了个多余的点,属于语法错误,应该写成df[col]- 没处理空值,要是单元格里有
NaN,调用replace会直接报错 - 列名匹配
PHONE时没开启大小写不敏感,得给str.contains加case=False参数
修正后的基础版代码
import pandas as pd # 筛选所有含PHONE的列(大小写不敏感) phone_cols = df.columns[df.columns.str.contains('PHONE', case=False)] for col in phone_cols: # 处理空值,仅对非空内容做格式清理 df[col] = df[col].apply(lambda x: ''.join([c for c in str(x) if c.isdigit()]) if pd.notna(x) else x)
更简洁的正则版(推荐)
用正则直接替换所有非数字字符,一步到位更高效:
import pandas as pd import re phone_cols = df.columns[df.columns.str.contains('PHONE', case=False)] def clean_phone(x): if pd.notna(x): return re.sub(r'\D', '', str(x)) return x # 批量处理所有目标列 df[phone_cols] = df[phone_cols].applymap(clean_phone)
关键说明
re.sub(r'\D', '', str(x)):\D匹配所有非数字字符,直接替换为空字符串,一次性清理括号、空格、横杠等格式符号pd.notna(x):先判断单元格是否为空,避免空值调用字符串方法时报错applymap:对DataFrame的每个元素应用清理函数,比循环列再单独处理更简洁
内容的提问来源于stack exchange,提问作者lengthy_preamble
相关产品推荐
相关产品推荐

