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

如何将DataFrame单列拆分为指定的4个不同列?

解决DataFrame中Dump列拆分问题

需求说明

需将DataFrame的Dump列拆分为Item、Qty、Part_no、Description四列,以下是示例数据与预期输出:

DATA1示例

Dump               
12525 2 153 89-8 Winch
24798 1 147 65-4 Gear
65116 4          Screw 
46456 1          Rowing
46563 5          Nut       

预期输出1

Item  Qty  Part_no    Description              
12525  2    153 89-8   Winch
24798  1    147 65-4     Gear
65116  4               Screw 
46456  1               Rowing
46563  5               Nut       

DATA2示例

Dump               
12525 2 153 89-8 Winch Gear
24798 1 147 65-4 Gear nuts
65116 X          Screw bolts
46456 1          Rowing rings
46563 X          Nut       

预期输出2

Item  Qty  Part_no    Description              
12525  2    153 89-8   Winch Gear
24798  1    147 65-4   Gear nuts
65116  X               Screw bolts
46456  1               Rowing rings
46563  X               Nut       

失败尝试

以下两种方法均未得到理想结果:

  1. 使用str.split按空格拆分
data_df[['Item','Qty','Part_no','Description']] = data_df["Dump"].str.split(" ", 3, expand=True)

错误输出:

Item  Qty  Part_no  Description              
12525  2    153 89-8   Winch
24798  1    147 65-4   Gear
65116  4    Screw 
46456  1    Rowing
46563  5    Nut       
  1. 使用正则str.extract
data_df[['Item','Qty','Part_no','Description']] = data_df['Dump'].str.extract(r'(\d+)\s+(\S+)\s+(\d*)\s*(.+)$')

此方法无法正确捕获包含空格的Part_no,也无法处理无Part_no的行。

可行解决方案

方案1:自定义函数处理每行

通过apply遍历每行,根据拆分后的元素长度分配对应列的值:

import pandas as pd

def split_dump(row):
    parts = row['Dump'].split()
    item = parts[0]
    qty = parts[1]
    # 判断是否存在Part_no(拆分后元素数>=4)
    if len(parts) >= 4:
        part_no = f"{parts[2]} {parts[3]}"
        # 剩余部分拼接为Description
        description = ' '.join(parts[4:]) if len(parts) > 4 else ''
    else:
        part_no = ''
        description = ' '.join(parts[2:]) if len(parts) >= 2 else ''
    return pd.Series([item, qty, part_no, description], index=['Item','Qty','Part_no','Description'])

# 应用函数并赋值新列
data_df[['Item','Qty','Part_no','Description']] = data_df.apply(split_dump, axis=1)

方案2:优化正则表达式

使用更精准的正则匹配,兼容有/无Part_no的情况:

import pandas as pd

# 正则解释:
# ^(\S+):匹配开头的非空白字符(Item)
# \s+(\S+):匹配空格后的非空白字符(Qty)
# \s+(?:(\S+\s+\S+)\s+)?:可选匹配包含空格的Part_no,非捕获组包裹捕获组
# (.*)$:匹配剩余所有内容作为Description
data_df[['Item','Qty','Part_no','Description']] = data_df['Dump'].str.extract(r'^(\S+)\s+(\S+)\s+(?:(\S+\s+\S+)\s+)?(.*)$')

# 将空值填充为空白字符串
data_df[['Part_no','Description']] = data_df[['Part_no','Description']].fillna('')

两种方案均可实现需求,其中方案1逻辑直观易调整,方案2适合处理正则能覆盖的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:05:27