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

如何使用正则表达式将Pandas DataFrame列拆分为多列?

解决方案:拆分文本到多列并处理可选的"notmessage"后缀

首先,我们需要明确你的需求:从Column1中提取"notmessage"之前的单词,最多提取3个,不足的位置用NaN(也就是你说的null)填充。下面提供两种简洁的实现方法:

方法一:先清理文本再拆分(更直观)

这种方法先把末尾的"notmessage"去掉,再拆分剩余内容到三列:

import pandas as pd

# 示例数据
data = {
    'Column1': [
        'message1 message2 notmessage',
        'message1 message2',
        'message1 message2 message3 notmessage'
    ]
}
df = pd.DataFrame(data)

# 步骤1:移除末尾的"notmessage"(如果存在)
df['cleaned_text'] = df['Column1'].str.replace(r'\s+notmessage$', '', regex=True)

# 步骤2:拆分清理后的文本为3列,自动填充NaN
split_cols = df['cleaned_text'].str.split('\s+', expand=True).rename(columns={0:'A', 1:'B', 2:'C'})

# 步骤3:合并到原DataFrame并清理临时列
result = df.join(split_cols).drop('cleaned_text', axis=1)

print(result)

输出结果完全符合你的要求:

Column1        A        B        C
0        message1 message2 notmessage  message1  message2     NaN
1                message1 message2  message1  message2     NaN
2  message1 message2 message3 notmessage  message1  message2  message3

方法二:用正则一次性提取(更高效)

如果你想用str.extract直接实现,关键是要写一个包含三个可选捕获组的正则,同时匹配末尾的"notmessage":

# 正则解释:
# ^(\w+) 匹配第一个单词(捕获到A)
# \s+(\w+) 匹配第二个单词(捕获到B)
# (?:\s+(\w+))? 可选的第三个单词(捕获到C,没有则为NaN)
# (?:\s+notmessage)? 可选的末尾notmessage(不捕获)
regex = r'^(\w+)\s+(\w+)(?:\s+(\w+))?(?:\s+notmessage)?$'

# 提取并命名列
extract_cols = df['Column1'].str.extract(regex, expand=True).rename(columns={0:'A', 1:'B', 2:'C'})

# 合并到原DataFrame
result = df.join(extract_cols)

这个方法和第一种结果一致,不需要临时列,更简洁。

为什么你之前的方法无效?

你提到的df.join(df['Column1'].str.extract('(my_regex)',expand=True).rename(...))失效,原因是:

  • 你的正则(my_regex)只定义了一个捕获组,所以str.extract只返回一列,后续重命名{0:'A',1:'B',2:'C'}会找不到列1和列2,自然无法生成B、C列。
  • 解决的核心是让正则包含对应A、B、C的三个捕获组(第三个设为可选),这样str.extract会返回三列,不足的位置自动填充NaN。

内容的提问来源于stack exchange,提问作者Rafał

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 08:57:45