求助:将DataFrame列拆分产品名与技术细节列,正则实现遇问题
问题描述
我有一个pandas DataFrame,其Description列包含合并的产品名称与技术细节,希望将其拆分为两列:一列存储实际产品名称,另一列存储技术细节。尝试使用正则表达式拆分后,对应行的产品名称变为空值,无法得到预期结果。
示例DataFrame与原代码如下:
import pandas as pd import re df = pd.DataFrame({'Description': ['WASHER tey DIN6340 10.5 C 35;', 'CABINET EL', 'CYLINDER SCREW', 'M12x N15']}) # 原尝试代码 df['Technical Data'] = df['Description'].str.extract(r'^.*?(\\s\\w*\\d+\\w*\\s.*)$') df['Product Description'] = df['Description'].apply(lambda x: re.sub(r'^.*?(\\w*\\d+\\w*\\s.*)$', '', x))
问题根源
- 正则转义错误:原正则中的
\\s、\\d多了一层转义,Python字符串中只需单个反斜杠(\s、\d),多余的转义会导致正则无法正确匹配目标内容。 - 匹配逻辑缺陷:原正则
^.*?(\\w*\\d+\\w*\\s.*)$会匹配从字符串开头到包含数字的整个内容,替换后直接清空了产品名称部分;同时extract也因转义问题无法正确捕获技术细节。
解决方案
核心思路是区分无数字的产品名称和含数字的技术细节,以下两种方案均可实现需求:
方案一:一次性提取两列(高效推荐)
利用正则分组,一次完成产品名称和技术细节的提取:
import pandas as pd df = pd.DataFrame({'Description': ['WASHER tey DIN6340 10.5 C 35;', 'CABINET EL', 'CYLINDER SCREW', 'M12x N15']}) # 正则分组:第一组匹配开头无数字的文本(产品名称),第二组匹配含数字的后续内容(技术细节) df[['Product Description', 'Technical Data']] = df['Description'].str.extract(r'^([^\d]+?)(\s?\w*\d+.*)?$') # 清理空值与多余空格 df['Product Description'] = df.apply( lambda row: row['Description'] if pd.isna(row['Technical Data']) else row['Product Description'].strip(), axis=1 ) df['Technical Data'] = df['Technical Data'].str.strip() print(df)
方案二:分开提取与替换
修正正则转义问题,分别处理技术细节和产品名称:
import pandas as pd import re df = pd.DataFrame({'Description': ['WASHER tey DIN6340 10.5 C 35;', 'CABINET EL', 'CYLINDER SCREW', 'M12x N15']}) # 提取技术细节:匹配第一个含数字的部分及后续内容 df['Technical Data'] = df['Description'].str.extract(r'(\s?\w*\d+.*)$')[0].str.strip() # 提取产品名称:移除技术细节部分,无技术细节则保留原内容 df['Product Description'] = df.apply( lambda row: row['Description'].replace(row['Technical Data'], '').strip() if pd.notna(row['Technical Data']) else row['Description'], axis=1 ) print(df)
预期输出
两种方案均会生成如下结果:
| Description | Product Description | Technical Data |
|---|---|---|
| WASHER tey DIN6340 10.5 C 35; | WASHER tey | DIN6340 10.5 C 35; |
| CABINET EL | CABINET EL | NaN |
| CYLINDER SCREW | CYLINDER SCREW | NaN |
| M12x N15 | NaN | M12x N15 |
内容的提问来源于stack exchange,提问作者Pravin
相关产品推荐
相关产品推荐

