Python str对象没有属性str
我正在尝试实现一个函数,该函数执行以下操作:Python str对象没有属性str,python,regex,pandas,Python,Regex,Pandas,我正在尝试实现一个函数,该函数执行以下操作: 遍历一列-df['input_str'],该列包含诸如'disvt',disr5','disvt_r1','disr5/r6'之类的字符串 如果字符串包含该模式,则使用.extract()提取该模式并将其附加到列表中 如果列表没有长度,则返回0 否则,将列表中的项目连接到_ 目标是创建一个新列,其中包含与提供的模式(即vt、r5、vt_r1、r5/r6)的匹配 输入数据帧 col1 col2 col3 col4 input_str
col1 col2 col3 col4 input_str
a . . . disvt
b . . . disr5
c . . . disvt_r1
d . . . disr5/r6
应用函数创建新列:
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.extract()
,但需要修复正则表达式模式。关键是将不同的模式连接成一个由or运算符|
分隔的字符串,并包含在两个括号之间的捕获组内:
patterns = ["r\d{1}", "vt", "v\d{2}", "v\d{1}"]
df['new_column'] = df['input_str'].str.extract('(' + '|'.join(patterns) + ')')
df
Out[1]:
col1 col2 col3 col4 input_str new_column
0 a . . . disvt vt
1 b . . . disr5 r5
2 c . . . disvt_r1 vt
3 d . . . disr5/r6 r5
方法str.contains
仅适用于pandas.Series
。您应该在
中对普通字符串使用,如下所示:
if input_str in pattern:
而不是
if input_str.contains(pattern):
同样,方法str.extract
仅适用于pandas.Series
。您可以尝试re.match
、re.findall
、列表理解或其他对普通python字符串有效的替代方法。您可以使用单个模式,而不是创建模式列表,并使用
模式:
v(?:t|\d{1,2})|r\d
比如说
import pandas as pd
items= [
"disvt",
"disr5",
"disvt_r1",
"disr5/r6"
]
df = pd.DataFrame(items, columns=["input_str"])
df['new_column'] = df['input_str'].str.findall(r"v(?:t|\d{1,2})|r\d").apply('_'.join)
print(df)
输出
input_str new_column
0 disvt vt
1 disr5 r5
2 disvt_r1 vt_r1
3 disr5/r6 r5_r6
我认为你的代码的第二部分是错误的?模式应该有正则表达式模式,为其中的歧义道歉。我在input_str中尝试了if模式,解决了那里的问题,但是.extract()也出现了同样的问题。您可以发布一个工作示例吗?我们不知道什么是input\u str
。你说它像一个普通的python字符串,但你似乎在使用panda
string方法来对付它。还有一个df[“new_column”]…
部分似乎与函数完全无关。@tdelaney-刚刚添加了更多信息。@用户可以看到我的答案,但您需要修复正则表达式模式以获得所需的输出。
input_str new_column
0 disvt vt
1 disr5 r5
2 disvt_r1 vt_r1
3 disr5/r6 r5_r6