str.split()无keep_empty参数,处理连续分隔符需用split(",", expand=true)后补空或改用extract/extractall;固定分隔符应设regex=false;复杂结构优先用具名捕获组extract;重复变长字段用findall+json_normalize。

用 str.split() 处理单一分隔符但保留空字段
当文本列里是类似 "apple,banana,,cherry" 这种含连续分隔符的结构,直接调用 df["col"].str.split(",") 默认会丢掉空字符串(返回 ['apple', 'banana', 'cherry']),这常导致后续对齐出错。
必须显式传入 expand=False(默认值)+ regex=False(避免意外触发正则)+ 关键参数 expand=True 配合 n 控制拆分次数,但更稳妥的是加 keep_empty=True —— 等等,str.split() 根本没有这个参数。真实解法是:用 str.split(",", expand=True) 后手动补空位,或改用 str.extractall()。
- 若分隔符是固定字符串(如逗号、竖线),优先设
regex=False,避免正则元字符误匹配 -
expand=True返回 DataFrame,expand=False返回 Series of lists;后者内存更省,但后续操作更麻烦 - 想限制最多拆 3 次?用
n=3,超出部分保留在最后一个元素里
用 str.extract() 拆分带命名模式的复杂结构
比如一列包含 "ID:123|Name:John|Dept:Eng|Level:Senior",靠 split("|") 无法保证字段顺序和缺失容忍。这时应写具名捕获组正则:
df["col"].str.extract(r"ID:(?P<id>\d+)\|Name:(?P<name>[^|]+)\|Dept:(?P<dept>[^|]+)\|Level:(?P<level>[^|]+)")</level></dept></name></id>
注意:[^|]+ 比 .*? 更安全,防止跨字段贪婪匹配;所有组名会变成新列名;某行若不匹配整条,对应位置返回 NaN。
- 字段可能缺失?把每个组改成可选:
Dept:(?P<dept>[^|]+)?</dept>,但要小心None和空字符串的区别 - 性能敏感时,先用
df["col"].str.contains(pattern)粗筛再 extract,避免对全量数据跑正则 - 如果字段顺序不固定(如
"Name:John|ID:123"也可能出现),得用多个str.extract()分别抓,或改用str.findall()+ 构造字典
用 str.findall() + pd.json_normalize() 处理重复/变长子结构
遇到像 "tag:urgent,tag:bug,tag:ui,meta:prio:high" 这类含重复前缀、数量不定的片段,split() 和单次 extract() 都不好使。正确路径是:
- 先用
findall(r"tag:([^,]+)")提取所有 tag 值,得到 list of lists - 再用
pd.json_normalize(df["col"].str.findall(r"tag:([^,]+)"))展开成宽表(自动补 NaN) - 若需保留原始索引对齐,记得在
json_normalize()里传record_prefix或后续add_prefix() - 正则里别漏转义:匹配字面量点号得写
\.,否则.是任意字符
为什么 apply(re.split) 多数时候是错的
有人习惯写 df["col"].apply(lambda x: re.split(r"\s*,\s*", x)),这看似灵活,实则三重隐患:
- 无法利用 pandas 底层向量化,10 万行可能比
str.split()慢 5–10 倍 - 返回类型不统一:某行是
None(没匹配)、某行是 list、某行是 str,后续explode()容易报错 - 异常难调试:某条脏数据让整个
apply报TypeError,而str.split()对非字符串自动返回NaN
除非你真需要每行调用不同正则、或嵌套逻辑判断,否则别碰 apply 跑正则 —— pandas 的 str 方法已经覆盖 95% 场景。
最易被忽略的一点:正则编译对象传给 str.split() 或 str.extract() 时,pandas 内部不会复用,每次都在重新编译。高频使用务必提前用 re.compile() 缓存。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











