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

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

  • 遍历一列-df['input_str'],该列包含诸如'disvt',disr5','disvt_r1','disr5/r6'之类的字符串
  • 如果字符串包含该模式,则使用.extract()提取该模式并将其附加到列表中
  • 如果列表没有长度,则返回0
  • 否则,将列表中的项目连接到_
  • 目标是创建一个新列,其中包含与提供的模式(即vt、r5、vt_r1、r5/r6)的匹配

    输入数据帧

    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