You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按分隔符拆分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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 22:06:05