繁体   English   中英

如何在 pandas 中的另一个单词之前提取一个单词

[英]How to extract a word before another word in pandas

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

play_id 类型 文本
1 经过 乔恩完成传球给本。
2 经过 时钟 14:52,乔恩传球给米奇。
3 匆忙 弗兰克·拉什。

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

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

这给了我这个:

play_id 类型 文本 过路人
1 经过 乔恩完成传球给本。 乔恩
2 经过 时钟 14:52,乔恩传球给米奇。 时钟 14:52,乔恩
3 匆忙 弗兰克·拉什。

它适用于第一个和第三个 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:应该是 boolean ndarray

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

  • 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

尝试使用(?=)积极的前瞻,一种零宽度断言 因此,代码将如下所示:

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

Output:

| 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    |

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM