我有一个数据框列,其中包含产品和技术细节合并.我只想把它们分开成2列,就像实际产品名称在一列,其他技术细节在一列.

我试图使用正则表达式来解决这个问题,并分别拆分技术细节,但无论在哪里拆分技术细节,产品名称都是空的.不确定哪里出了问题.

This is the dataframe I tried
df = pd.DataFrame({'Description': ['WASHER tey DIN6340 10.5 C 35;', 'CABINET EL', 'CYLINDER SCREW', 'M12x N15']})

Code:
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))

The result I'm getting is enter image description here

所以我希望输出是这样的

enter image description here

对如何做到这一点有什么建议吗?

推荐答案

您可以尽可能少地捕获任何零个或多个字符("Technical Data"列),然后是可选的空格,后跟一个字母数字字符串,然后是字符串末尾的任何字符("Product Description"列):

df[['Technical Data','Product Description']] = df['Description'].str.extract(r'^(.*?)(?:\s*((?:[a-zA-Z]+[0-9]|[0-9]+[a-zA-Z]).*))?$', expand=True)

请看regex demo.

Details:

  • ^-字符串的开始
  • (.*?)-组1:除换行符之外的任何零个或更多字符,尽可能少
  • (?:\s*((?:[a-zA-Z]+[0-9]|[0-9]+[a-zA-Z]).*))? - an optional group matching
    • \s*-零个或更多空格
    • ((?:[a-zA-Z]+[0-9]|[0-9]+[a-zA-Z]).*)-组2:一个或多个字母,然后是一个数字,或者一个或多个数字,然后是一个字母,然后是除换行符之外的任何零个或多个字符,尽可能少
  • $-字符串末尾.

如果你有Unicode字母,common [^\W\d_] construct可以帮助你(你需要用[^\W\d_]代替[a-zA-Z]).

Python相关问答推荐

从收件箱获取特定列中的重复行

Django关于UniqueBindition的更新

Altair -箱形图边界设置为黑色,中线设置为红色

如何处理必须存在于环境中但无法安装的Python项目依赖项?

如何在矩阵上并行化简单循环?

code _tkinter. Tcl错误:窗口路径名称错误.!按钮4"

ambda将时间戳与组内另一列的所有时间戳进行比较

如何使用矩阵在sklearn中同时对每个列执行matthews_corrcoef?

如何调整spaCy token 化器,以便在德国模型中将数字拆分为行末端的点

pandas DataFrame GroupBy.diff函数的意外输出

Pandas 有条件轮班操作

在Google Colab中设置Llama-2出现问题-加载判断点碎片时Cell-run失败

将输入管道传输到正在运行的Python脚本中

优化器的运行顺序影响PyTorch中的预测

计算天数

为什么在FastAPI中创建与数据库的连接时需要使用生成器?

关于两个表达式的区别

Python—为什么我的代码返回一个TypeError

当条件满足时停止ODE集成?

在用于Python的Bokeh包中设置按钮的样式