使用 str.contains 并基于 if-else 条件创建新列

Mar*_*cke 5 python lambda apply pandas

我有一个名称“模式”列表,我希望将其与“url_text”列中的字符串匹配。如果存在匹配,即True名称应打印在新列“pol_names_block”中,如果将该False行留空。

pattern = '|'.join(pol_names_list) 

print(pattern)
'Jon Kyl|Doug Jones|Tim Kaine|Lindsey Graham|Cory Booker|Kamala Harris|Orrin Hatch|Bernie Sanders|Thom Tillis|Jerry Moran|Shelly Moore Capito|Maggie Hassan|Tom Carper|Martin Heinrich|Steve Daines|Pat Toomey|Todd Young|Bill Nelson|John Barrasso|Chris Murphy|Mike Rounds|Mike Crapo|John Thune|John. McCain|Susan Collins|Patty Murray|Dianne Feinstein|Claire McCaskill|Lamar Alexander|Jack Reed|Chuck Grassley|Catherine Masto|Pat Roberts|Ben Cardin|Dean Heller|Ron Wyden|Dick Durbin|Jeanne Shaheen|Tammy Duckworth|Sheldon Whitehouse|Tom Cotton|Sherrod Brown|Bob Corker|Tom Udall|Mitch McConnell|James Lankford|Ted Cruz|Mike Enzi|Gary Peters|Jeff Flake|Johnny Isakson|Jim Inhofe|Lindsey Graham|Marco Rubio|Angus King|Kirsten Gillibrand|Bob Casey|Chris Van Hollen|Thad Cochran|Richard Burr|Rob Portman|Jon Tester|Bob Menendez|John Boozman|Mazie Hirono|Joe Manchin|Deb Fischer|Michael Bennet|Debbie Stabenow|Ben Sasse|Brian Schatz|Jim Risch|Mike Lee|Elizabeth Warren|Richard Blumenthal|David Perdue|Al Franken|Bill Cassidy|Cory Gardner|Lisa Murkowski|Maria Cantwell|Tammy Baldwin|Joe Donnelly|Roger Wicker|Amy Klobuchar|Joel Heitkamp|Joni Ernst|Chris Coons|Mark Warner|John Cornyn|Ron Johnson|Patrick Leahy|Chuck Schumer|John Kennedy|Jeff Merkley|Roy Blunt|Richard Shelby|John Hoeven|Rand Paul|Dan Sullivan|Tim Scott|Ed Markey'
Run Code Online (Sandbox Code Playgroud)

我正在使用以下代码,如果“pattern”中的名称出现在“url_text”列的行中,则df['url_text'].str.contains(pattern)结果为其他情况。我已经尝试了以下代码:TrueFalse

df['pol_name_block'] = df.apply(
    lambda row: pol_names_list if df['url_text'].str.contains(pattern) in row['url_text'] else ' ',
    axis=1
)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

TypeError: 'in <string>' requires string as left operand, not Series
Run Code Online (Sandbox Code Playgroud)

tle*_*ali 2

从这个玩具数据框:

>>> import pandas as pd
>>> from io import StringIO

>>> df = pd.read_csv(StringIO("""
... id,url_text
... 1,Tim Kaine
... 2,Tim Kain
... 3,Tim
... 4,Lindsey Graham.com
... """), sep=',')
>>> df
    id  url_text
0   1   Tim Kaine
1   2   Tim Kain
2   3   Tim
3   4   Lindsey Graham.com
Run Code Online (Sandbox Code Playgroud)

从 开始pol_names_list,我们patterns通过像这样格式化它来构建:

patterns = '(%s)' % '|'.join(pol_names_list)
Run Code Online (Sandbox Code Playgroud)

然后,我们可以使用该extract方法为该列赋值,pol_name_block以获得预期的结果:

df['pol_name_block'] = df['url_text'].str.extract(patterns)
Run Code Online (Sandbox Code Playgroud)

输出 :

    id  url_text            pol_name_block
0   1   Tim Kaine           Tim Kaine
1   2   Tim Kain            NaN
2   3   Tim                 NaN
3   4   Lindsey Graham.com  Lindsey Graham
Run Code Online (Sandbox Code Playgroud)