如何将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的结果:
| Reference | CODE | PRODUCT | TYPE |
|---|---|---|---|
| A/B/C/D/E | C | D | E |
| X/Y/Z | X | Y | Z |
| P/Q | NaN | P | Q |
| M | NaN | NaN | M |
| NaN | NaN | NaN |
方法二:正则表达式提取
如果想用更简洁的方式,也可以用正则匹配最后三个斜杠分隔的部分:
df2 = df1.copy() # 正则匹配:匹配最后三个由斜杠分隔的片段,允许前面有任意内容 df2[['CODE', 'PRODUCT', 'TYPE']] = df2['Reference'].str.extract( r'(?:.*\/)?(.*)\/(.*)\/(.*)' )
这个正则的逻辑是:
(?:.*\/)?:匹配前面的任意内容+斜杠(非捕获组,不生成列),?表示这部分可选(.*)\/(.*)\/(.*):捕获最后三个由斜杠分隔的片段,对应三列
注意:如果字符串不足三个片段,缺失的前序列会自动填充NaN,效果和方法一一致。
内容的提问来源于stack exchange,提问作者SGC
相关产品推荐
相关产品推荐

