str对象没有属性str

2024-04-29 00:05:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实现一个函数,该函数执行以下操作:

  1. 遍历一列-df['input_str'],该列包含诸如'disvt',disr5','disvt_r1','disr5/r6'之类的字符串
  2. 如果字符串包含该模式,则使用.extract()提取该模式并将其附加到列表中
  3. 如果列表没有长度,则返回0
  4. 否则,将列表中的项目与

目标是创建一个新列,其中包含与提供的模式(即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”

我在这一点上有点困惑,不确定解决这些问题的最佳方法


Tags: 函数df列表newinput模式listpattern
2条回答

您可以使用str.findall使用单个模式并使用apply连接结果,而不是创建模式列表

模式:

v(?:t|\d{1,2})|r\d

Regex demo

比如说

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

编辑(使用输入和预期输出更新问题后):

您可以简单地使用str.extract(),但需要修复您的正则表达式模式。关键是join将不同的模式转换成一个由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。您应该对普通字符串使用in,如下所示:

if input_str in pattern:

而不是

if input_str.contains(pattern):

同样,方法str.extract仅适用于pandas.Series。您可以尝试re.matchre.findall、列表理解或其他适用于普通python字符串的替代方法

相关问题 更多 >