我的知识记录

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。
  • 替换中文括号要写全角,正则里半角圆括号要转义。

Python pandas字符串处理分列替换教程

标签:

更新时间:2026-09-14 20:56:27

上一篇:Python读取CSV文件 csv模块教程:标准库一行读出来

下一篇:Python pandas读写SQLite数据库教程