Python pandas字符串处理分列替换教程
用pandas的str.split分列、str.replace替换、str.extract提取、str.contains筛选,处理Excel里混在一格的电话、地址、商品名等脏字符串。
场景痛点
从系统导出的表格,姓名和电话挤在一格,地址里混着省市街道,商品名带一堆括号备注。手动分列、替换、提取,几百行就要拖半天。pandas的 str 访问器一整套正则操作,一行代码搞定分列、替换、提取、模糊匹配。
用到的库
pip install pandas
完整代码
import pandas as pd
def sample_df():
return pd.DataFrame({
"info": ["张三|13800001111", "李四|13900002222", "王五|13700003333"],
"address": ["广东省深圳市南山区科技园", "北京市海淀区中关村", "上海市浦东新区陆家嘴"],
"goods": ["笔记本(商务版)", "鼠标(无线)", "键盘(机械)"],
})
def string_ops():
df = sample_df()
# 1. 按 | 分列,拆成两列
df[["name", "phone"]] = df["info"].str.split("|", expand=True)
# 去掉原列
df.drop(columns=["info"], inplace=True)
# 2. 从地址里提取省、市(正则分组)
df["province"] = df["address"].str.extract(r"(.+?省|.+?市)")
df["city"] = df["address"].str.extract(r"(.+?市)")
# 3. 商品名去掉括号及里面的内容
df["goods_name"] = df["goods"].str.replace(r"\(.*?\)", "", regex=True)
df["goods_spec"] = df["goods"].str.extract(r"\((.*?)\)")
# 4. 模糊匹配:筛选商品名包含"键"的行
mask = df["goods_name"].str.contains("键", na=False)
print("含'键'的商品:")
print(df[mask])
# 5. 大小写/空格清理
df["name"] = df["name"].str.strip()
print("处理后:")
print(df)
return df
if __name__ == "__main__":
string_ops()
代码讲解
str.split("|", expand=True)把一列按分隔符拆成多列,直接赋给新列名列表。expand=False返回列表,适合拆成字典列。str.extract(r"正则(分组)")用正则提取分组内容,一列只能提取一个分组;多个分组要用多个extract。str.replace(r"\(.*?\)", "", regex=True)正则替换,删掉括号及内部内容。regex=False时是字面量替换。str.contains("关键字")返回布尔Series,用于df[mask]筛选行,等价于SQL的LIKE。- 所有
str.xxx操作会自动跳过NaN,不会因为空值报错。
运行结果
控制台打印含"键"的筛选结果(键盘那行),以及处理后的完整DataFrame:name/phone分列、province/city提取、goods_name去掉括号、goods_spec保留括号内容。
注意事项
str.split用竖线分隔时,竖线在正则里是特殊字符,str.split("|")默认按字面量分,但建议str.split(r"\|", regex=True)更稳。- 正则提取时,源数据格式不一致会返回NaN,提取后要
df["city"].isna().sum()看一眼有多少没匹配上。 - 大量字符串操作时,先
df["col"] = df["col"].astype(str)统一转字符串,避免数值列调用str方法报AttributeError。 - 替换中文括号要写全角,正则里半角圆括号要转义。

更新时间:2026-09-14 20:56:27
上一篇:Python读取CSV文件 csv模块教程:标准库一行读出来