如何将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
失败尝试
以下两种方法均未得到理想结果:
- 使用
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
- 使用正则
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
相关产品推荐
相关产品推荐

