如何按分隔符拆分pandas DataFrame单元格并按条件生成多个DataFrame
问题原因
你当前代码不符合预期的核心原因是:replace方法只会对匹配正则表达式的内容做替换,未匹配到规则的单元格会直接保留原值。你写的df2正则仅能匹配包含至少1个短横线的字符串,对于「4」「99」这类没有短横线的内容完全不匹配,所以原值被保留了下来。
推荐实现方案
更简单且不易出错的方式是直接使用pandas原生的字符串拆分方法,不需要手写正则:
import pandas as pd # 初始化示例DataFrame df = pd.DataFrame({'a':["10-30-410","20-40-500","25-50"], 'b':["5-8-9","4", "99"]}) # 按短横线拆分每个单元格,最多拆分2次,自动生成3列,缺失值填充为NaN split_result = df.apply(lambda col: col.str.split('-', n=2, expand=True)) # 分别提取对应位置的内容,空值替换为空字符串 df1 = split_result.xs(0, level=1, axis=1).fillna('') df2 = split_result.xs(1, level=1, axis=1).fillna('') df3 = split_result.xs(2, level=1, axis=1).fillna('')
运行后得到的三个DataFrame完全符合你的预期输出。
正则方案修正
如果你坚持要用正则替换的方式实现,只需要调整正则规则覆盖所有场景即可:
# 提取第一个值 df1 = df.replace(r'^(\d+)(?:-.*)?$', r'\1', regex=True) # 提取第二个值,无对应值则返回空 df2 = df.replace(r'^(?:\d+-(\d+)(?:-.*)?|.*)$', r'\1', regex=True) # 提取第三个值,无对应值则返回空 df3 = df.replace(r'^(?:\d+-\d+-(\d+)|.*)$', r'\1', regex=True)
内容的提问来源于stack exchange,提问作者Chuck
相关产品推荐
相关产品推荐

