我有一个包含8000行的列,我需要创建一个新列,该列的值从现有列中提取
字符串如下所示:
TP-ETU06-01-525-W-133
我想从字符串中创建两个新列,其中第一个新列的值是从第二个字符串ETU06中提取的,第二个是从最后一个字符串133中提取的
我是通过以下方式做到这一点的:
df["sys_no"] = df.apply(lambda x:x["test_no"].split("-")[1] if (pd.notnull(x["test_no"]) and x["test_no"]!="" and len(x["test_no"].split("-"))>0) else None,axis=1)
df["package_no"] = df.apply(lambda x:x["test_no"].split("-")[-1] if (pd.notnull(x["test_no"]) and x["test_no"]!="" and len(x["test_no"].split("-"))>0) else None,axis=1)
它实际上工作得很好,但现有列具有不跟随其他列的随机字符串。因此,如果出现随机字符串,我希望在新列中留空
我应该如何更改脚本
谢谢
使用^{} 作为掩码,然后按^{} 拆分值,并通过仅按掩码索引筛选的行来选择secnd和last value:
这种方法使用regex和命名捕获组来查找和提取感兴趣的字符串,只需两行代码
regex对
split
:的确,不需要正则表达式。然而,从数据验证的角度来看,使用正则表达式有助于防止“散乱”数据悄悄进入。使用'blind'
split()
函数拆分(字符)上的数据;但如果源数据发生了变化怎么办?拆分函数对此视而不见。然而,使用正则表达式将有助于突出一个问题,因为模式根本不匹配。是的,您可能会收到一条错误消息,但这是一件好事,因为您将收到数据格式更改的警报,从而有机会解决问题或更新正则表达式模式此外,regex提供了一个健壮的解决方案,因为模式匹配整个字符串,并且忽略此模式之外的任何内容—如问题中提到的示例
如果您想对regex模式本身进行一些解释,只需添加一条注释,我将更新答案以进行解释
样本数据:
代码:
输出:
相关问题 更多 >
编程相关推荐