Pandas str.split用||分隔符拆分字符串为多列异常原因及解决方法
异常原因
pandas.Series.str.split 默认以正则规则匹配分隔符,两种错误写法的问题本质都是没有正确匹配字面量||:
- 传入
'||'作为分隔符时:正则语法中|是代表「或」逻辑的元字符,两个连续的|等价于匹配「空字符串或空字符串」,也就是字符串中所有字符间隙位置。指定拆分1次时,第一个拆分点在字符串最开头,因此切出的第一个元素为空字符串,第二个元素为完整原字符串,对应你看到的df3的异常结果。 - 传入
'[||]'作为分隔符时:正则语法中方括号代表字符集合,匹配集合内的任意单个字符,括号内重复写|不会改变匹配规则,最终只会匹配单个|字符。指定拆分1次时,会在第一个|的位置切分,切分后的后半段字符串开头还残留一个|,就出现了age列前多余竖线的问题。
正确调整方案
两种写法都可以得到和空格拆分一致的正确结果:
- 对正则元字符做转义,匹配字面量双竖线。正则中匹配特殊字符本身需要加反斜杠转义,双竖线对应的正则匹配规则为
\|\|:
import pandas as pd data2 = {'Name': ['Alice||23', 'Philip||12', 'Krish||64', 'John||29']} df2 = pd.DataFrame(data2) # 转义特殊字符,按双竖线拆分 df2[['Name', 'age']] = df2['Name'].str.split(r'\|\|', 1, expand=True)
- 关闭正则匹配模式,传入
regex=False参数,此时分隔符会按普通字符串字面量匹配,不需要手动转义特殊字符,写法更简洁不易出错:
df2[['Name', 'age']] = df2['Name'].str.split('||', 1, expand=True, regex=False)
运行后输出结果完全符合预期:
| Name | age | |
|---|---|---|
| 0 | Alice | 23 |
| 1 | Philip | 12 |
| 2 | Krish | 64 |
| 3 | John | 29 |
内容的提问来源于stack exchange,提问作者Aly
相关产品推荐
相关产品推荐

