作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有这个 pandas DataFrame,它描述了一场足球比赛中的比赛:
我的目标是创建一个名为“passer”的新列,其中包含一个脚本,该脚本将遍历“text”列中的描述,并将采用放在“pass”一词之前的名称。所以我首先使用这个:
df['passer'] = df['Text'].str.extract(r'(.*?)pass', expand=False).str.strip()
这给了我这个:
它适用于第一个和第三个 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: invalid entry 0 in condlist: should be boolean ndarray
有没有办法让这个功能起作用?这似乎是一个很好的方法,因为在其他情况下,我可以检查三个不同的条件,以便知道要使用哪个正则表达式。
最佳答案
pandas.Series.str.extract
具有积极的前瞻条件。
lookahead
的详尽解释。\s+pass
将适用于名称和 'pass'
之间的任意数量的空格(例如 'Jon PaSs'
)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
关于python - 如何在 Pandas 中的另一个词之前提取一个词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66049688/
我是一名优秀的程序员,十分优秀!