如何将DataFrame某列按指定分隔符拆分生成列表,优先不使用正则表达式
问题分析与解决方法
原代码存在的问题
- 逻辑错误:调用
re.split完成拆分后,你又使用' '.join()将拆分得到的列表重新拼接为单个字符串,自然无法得到预期的列表结果 - 匹配规则错误:正则会无差别拆分所有命中的分隔符,不会区分分隔符是否位于成对括号内部,不符合你保留括号内内容不拆分、保留括号本身的需求
- 缺少清洗逻辑:拆分后的元素会残留前后多余空格、首尾引号等无效内容
实现方案(无正则,易调试修改)
你没有正则使用经验的话,更推荐用字符遍历计数的方案实现,逻辑清晰,后续调整规则也很方便:
def split_ingredient(raw_str): result = [] current_segment = [] # 标记当前所处的括号嵌套层级 bracket_level = 0 delimiters = {',', ';', '(', ')', ':'} # 先清理首尾多余的引号、空格 s = str(raw_str).strip().strip('"') for char in s: if char == '(': bracket_level += 1 # 碰到最外层左括号,先把之前积攒的内容存入结果 if bracket_level == 1 and current_segment: result.append(''.join(current_segment).strip()) current_segment = [] current_segment.append(char) elif char == ')': current_segment.append(char) bracket_level -= 1 # 碰到最外层右括号,把整个括号内容存入结果 if bracket_level == 0 and current_segment: result.append(''.join(current_segment).strip()) current_segment = [] # 只有在括号最外层碰到分隔符才做拆分 elif char in delimiters and bracket_level == 0: if current_segment: result.append(''.join(current_segment).strip()) current_segment = [] else: current_segment.append(char) # 把最后一段未处理的内容存入结果 if current_segment: result.append(''.join(current_segment).strip()) # 过滤空字符串 return [item for item in result if item]
调用方法
直接对DataFrame的目标列应用上面的函数即可:
df['splited'] = df['ingredient'].apply(split_ingredient)
如果需要将括号内部的内容再拆分为子列表,只需要在括号内容入队前,对括号内的字符串再调用一次拆分函数即可。
内容的提问来源于stack exchange,提问作者Yoss
相关产品推荐
相关产品推荐

