如何在Pandas DataFrame中找到特定的子字符串,然后获取其后的文本?

时间:2019-02-21 05:43:05

标签: python pandas

所以我有一个从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") 但是我只是从中得到一个错误,我想是因为您不能仅仅检查这样的字符串。如果有人知道如何查找子字符串,然后在我希望知道的文本之后获得文本。

2 个答案:

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