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

如何将DataFrame的Reference列最后三个值拆分为CODE、PRODUCT、TYPE列?

解决方案

你的代码失败的核心原因是pandas的str.split方法不支持负整数作为n参数——n只能是非负整数,用来指定最大分割次数,无法通过负数实现"从末尾取N个部分"的需求。

要提取每行最后三个斜杠分隔的有效值,可以按以下两种方法处理:

方法一:分割后取最后三个元素

先将字符串按斜杠分割为列表,再提取每个列表的最后三个元素(不足3个时自动补NaN),最后转换为DataFrame列:

import pandas as pd

# 示例数据
df1 = pd.DataFrame({
    'Reference': [
        "A/B/C/D/E",
        "X/Y/Z",
        "P/Q",
        "M",
        ""
    ]
})

# 分割并提取最后三个元素,补全缺失值
split_lists = df1['Reference'].str.split('/').apply(
    lambda x: x[-3:] + [None]*(3 - len(x)) if len(x) < 3 else x[-3:]
)

# 转换为列并赋值给df2
df2 = df1.copy()
df2[['CODE', 'PRODUCT', 'TYPE']] = pd.DataFrame(split_lists.tolist())

运行后df2的结果:

ReferenceCODEPRODUCTTYPE
A/B/C/D/ECDE
X/Y/ZXYZ
P/QNaNPQ
MNaNNaNM
NaNNaNNaN

方法二:正则表达式提取

如果想用更简洁的方式,也可以用正则匹配最后三个斜杠分隔的部分:

df2 = df1.copy()
# 正则匹配:匹配最后三个由斜杠分隔的片段,允许前面有任意内容
df2[['CODE', 'PRODUCT', 'TYPE']] = df2['Reference'].str.extract(
    r'(?:.*\/)?(.*)\/(.*)\/(.*)'
)

这个正则的逻辑是:

  • (?:.*\/)?:匹配前面的任意内容+斜杠(非捕获组,不生成列),?表示这部分可选
  • (.*)\/(.*)\/(.*):捕获最后三个由斜杠分隔的片段,对应三列

注意:如果字符串不足三个片段,缺失的前序列会自动填充NaN,效果和方法一一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 07:25:20