我正在尝试实现一个函数,该函数执行以下操作:
目标是创建一个新列,其中包含与提供的模式(即vt、r5、vt_r1、r5/r6)的匹配
输入数据帧
col1 col2 col3 col4 input_str
a . . . disvt
b . . . disr5
c . . . disvt_r1
d . . . disr5/r6
def parse_info(input_str):
patterns = ["r\d{1}", "vt", "v\d{2}", "v\d{1}"]
new_list = []
for pattern in patterns:
if input_str.contains(pattern):
new_list.append(input_str.extract(pat=pattern, expand=False))
if len(new_list) == 0:
return np.nan
else:
return "_".join(new_list)
应用函数创建新列:
df["new_column"] = df.apply(
lambda x: x(df["input_str"]), axis=1
)
期望输出:
input_str new_column
disvt vt
disr5 r5
disvt_r1 vt_r1
r5/r6 r5_r6
这将返回以下错误:`str'对象没有包含的属性
当我将.contains更改为.str.contains()时,我现在得到的“str”对象没有属性“str”
我在这一点上有点困惑,不确定解决这些问题的最佳方法
您可以使用str.findall使用单个模式并使用apply连接结果,而不是创建模式列表
模式:
Regex demo
比如说
输出
编辑(使用输入和预期输出更新问题后):
您可以简单地使用
str.extract()
,但需要修复您的正则表达式模式。关键是join
将不同的模式转换成一个由or运算符|
分隔的字符串,并包含在两个括号之间的捕获组内部:方法
str.contains
仅适用于pandas.Series
。您应该对普通字符串使用in
,如下所示:而不是
同样,方法
str.extract
仅适用于pandas.Series
。您可以尝试re.match
、re.findall
、列表理解或其他适用于普通python字符串的替代方法相关问题 更多 >
编程相关推荐