繁体   English   中英

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

[英]How can I find a specific substring in a Pandas DataFrame, and then get the text after it?

所以我有一个从 html 网页获取的 Pandas 数据框。 数据框只有 1 列,该列没有识别名称。 我想从数据框中找到一个特定的子字符串,然后立即获取该子字符串之后的文本。

注意:在子字符串搜索中永远不会重复。
例如:学校 2 永远不会有 2 个实例:

数据框的格式如下:

School 1: 1 Hour Delay
School 2: 2 Hour Delay
School 3: Closed

我希望能够搜索学校 3:然后返回状态,是关闭、延迟 1 小时还是延迟 2 小时。

我最初的想法是if "School 3:" in df print("School 3: found")但我只是从中得到一个错误,我假设是因为你不能只检查这样的字符串。 如果有人知道如何找到一个子字符串,然后在它之后获取文本,我很想知道。

假设只有一行总是匹配这种情况下,你可以使用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

假设数据框看起来像

                   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

暂无
暂无

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

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