【问题标题】:How to extract a word before another word in pandas如何在熊猫中的另一个单词之前提取一个单词
【发布时间】:2021-05-08 23:50:17
【问题描述】:

我有这个 pandas DataFrame,它是对足球比赛中比赛的描述:

play_id type Text
1 pass Jon pass complete to Ben.
2 pass Clock 14:52, Jon pass complete to Mitch.
3 rush Frank rush.

我的目标是使用脚本创建一个名为“passer”的新列,该脚本将遍历“text”列中的描述,并采用放在单词“pass”之前的名称。所以我首先使用这个:

df['passer'] = df['Text'].str.extract(r'(.*?)pass', expand=False).str.strip()

这给了我这个:

play_id type Text passer
1 pass Jon pass complete to Ben. Jon
2 pass Clock 14:52, Jon pass complete to Mitch. Clock 14:52, Jon
3 rush Frank rush. NaN

它适用于第一个和第三个 playid,但不适用于第二个,因为它需要时间,有时可以包含在描述中。

我尝试在创建我的专栏时实现条件,代码检查描述中是否包含“时钟”,并使用正确的正则表达式,但这不起作用:

conditions = [
    (np.where(df.Text.str.contains('Clock', case=False))),
    (np.where(~df.Text.str.contains('Clock', case=False)))
    ]

choices = [
    df['Text'].str.extract(r', (.*?) pass', expand=False).str.strip(), 
    df['Text'].str.extract('(.*?) pass', expand=False).str.strip()
    ]

df['passerNEW'] = np.select(conditions, choices, default='NaN')
df

我收到以下错误:

TypeError: condlist 中的无效条目 0: 应该是布尔型 ndarray

有没有办法让这个功能发挥作用?这似乎是一个很好的方法,因为在其他情况下,我可以检查三个不同的条件,以便知道要使用哪个正则表达式。

【问题讨论】:

    标签: python regex pandas regex-lookarounds


    【解决方案1】:
    • pandas.Series.str.extract 与肯定的前瞻条件一起使用。
    • flags=re.IGNORECASE 用于忽略'pass' 的大小写
      • 可以使用df.Text.str.lower().str.extract('(\w+(?=\s+pass))') 代替为标志导入re
    import pandas as pd
    import re
    
    # test dataframe
    data = {'play_id': ['1', '2', '3'], 'type': ['pass', 'pass', 'rush'], 'Text': ['Jon PASS complete to Ben.', 'Clock 14:52, Jon pass complete to Mitch.', 'Frank rush.']}
    df = pd.DataFrame(data)
    
    # display(df)
    play_id type                                     Text
          1 pass                Jon PASS complete to Ben.
          2 pass Clock 14:52, Jon pass complete to Mitch.
          3 rush                              Frank rush.
    
    # extract
    df['passer'] = df.Text.str.extract('(\w+(?=\s+pass))', flags=re.IGNORECASE)
    
    # display(df)
    play_id type                                     Text passer
          1 pass                Jon PASS complete to Ben.    Jon
          2 pass Clock 14:52, Jon pass complete to Mitch.    Jon
          3 rush                              Frank rush.    NaN
    

    【讨论】:

    • 完美运行,感谢您提供代码和额外信息!
    【解决方案2】:

    尝试使用(?=) 积极的前瞻,zero-width assertion 的类型。因此,代码将如下所示:

    df['passer'] = df['Text'].str.extract(r'(\w+)(?=\spass)', expand=False)
    

    输出:

    | play_id  | type  | Text                                     | passer |
    | -------- | ----- | ---------------------------------------- | ------ |
    | 1        | pass  | Jon pass complete to Ben.                | Jon    |
    | 2        | pass  | Clock 14:52, Jon pass complete to Mitch. | Jon    |
    | 3        | rush  | Frank rush.                              | NaN    |
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 2021-05-07
      • 2021-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多