所以我有一个从html网页获取的Pandas数据框。数据框只有1列,并且该列没有标识名。我想从数据框中找到一个特定的子字符串,然后立即获取该子字符串后面的文本。
注意:子字符串搜索中绝不会重复。
例如:永远不会有2个School 2实例:
数据框的格式如下:
School 1: 1 Hour Delay
School 2: 2 Hour Delay
School 3: Closed
我希望能够搜索School 3:然后返回状态,无论是关闭,延迟1小时还是2小时。
我最初的想法只是if "School 3:" in df print("School 3: found")
但是我只是从中得到一个错误,我想是因为您不能仅仅检查这样的字符串。如果有人知道如何查找子字符串,然后在我希望知道的文本之后获得文本。
答案 0 :(得分:1)
假设一个行总是完全符合此条件,则可以使用str.extract
:
df.iloc[:,0].str.extract('(?<=School 3: )(.*)', expand=False).dropna().values[0]
# 'Closed'
(注意:如果有多个行符合此条件,则仅返回第一个匹配项的状态。)
否则,如果可能没有匹配项,则需要一个try-except:
try:
status = (df.iloc[:,0]
.str.extract('(?<=School 3: )(.*)', expand=False)
.dropna()
.values[0])
except (IndexError, ValueError):
status = np.nan
答案 1 :(得分:0)
假设数据框看起来像
status
0 School 1: 1 Hour Delay
1 School 2: 2 Hour Delay
2 School 3: Closed
您可以做到
txt = 'School 3'
df.status[df.status.str.contains(txt)].str[len(txt) + 2:] # +2 for skipping ": " after the school name
结果:
2 Closed
Name: status, dtype: object
但是,通过将包含两个信息的单列一分为二,IMO将更加清晰:
df = df.status.str.split(': ', expand=True)
df.columns = ['school', 'status']
# school status
#0 School 1 1 Hour Delay
#1 School 2 2 Hour Delay
#2 School 3 Closed
然后,您可以通过第一列的布尔索引简单地检索第二列的内容:
txt = 'School 3'
df.status[df.school==txt]
#2 Closed
#Name: status, dtype: object