Pandas拆分字符串列结果不符合预期 如何正确拆为两列
问题原因
你之前写的正则r'\s\s*?(?=[A-Z])'逻辑是匹配所有「后面紧跟大写字母的空格」,只要空格后是大写就触发拆分,没有限制拆分位置和拆分次数,自然会把Common Inlet、Vyrnwy Line 2这类多词片段拆成多个碎块,得到多余列。
观察预期拆分规律可以发现:唯一合法的拆分点,是前面片段以数字结尾、后面接大写开头新片段的那个空格,其他位置的大写前空格都不能拆。
可行代码
直接用限制拆分位置+限制拆分次数的方案即可,代码如下:
import pandas as pd # 原始数据 full_name = pd.Series([ 'Reservoir 1 Compartment 1', 'Reservoir 1 Common Inlet', 'Reservoir 2 Compartment 1', 'Vyrnwy Line 2 Balancing Tank 1', 'Reservoir 1' ]) # 拆分逻辑:仅在「数字后、大写前」的空格处拆分,最多拆1次 res_compartment_split = full_name.str.split( r'(?<=\d)\s+(?=[A-Z])', n=1, # 限制最多拆分1次,避免后续片段被拆碎 expand=True ) # 重命名列(可选) res_compartment_split.columns = ['parent_facility', 'sub_facility']
运行结果
执行后输出完全匹配预期:
parent_facility sub_facility 0 Reservoir 1 Compartment 1 1 Reservoir 1 Common Inlet 2 Reservoir 2 Compartment 1 3 Vyrnwy Line 2 Balancing Tank 1 4 Reservoir 1 None
规则说明
(?<=\d):反向断言,要求拆分位置的前一个字符是数字,保证刚好在第一部分的编号后面切\s+:匹配拆分点中间的任意数量空格(?=[A-Z]):正向断言,要求拆分位置的后一个字符是大写字母,匹配后续片段的开头n=1:pandas字符串拆分的核心参数,强制整个字符串最多只拆1次,哪怕后续内容还有符合规则的位置也不拆分,彻底避免多列问题。
内容的提问来源于stack exchange,提问作者Somto
相关产品推荐
相关产品推荐

