Python 如何在Pandas数据帧中找到特定的子字符串,然后获取其后面的文本?

Python 如何在Pandas数据帧中找到特定的子字符串,然后获取其后面的文本?,python,pandas,Python,Pandas,所以我有一个熊猫数据框,我是从一个html网页。dataframe只有一列,该列没有标识名。我想从dataframe中找到一个特定的子字符串,然后获取紧跟在该子字符串后面的文本 注意:子字符串搜索中永远不会重复

所以我有一个熊猫数据框,我是从一个html网页。dataframe只有一列,该列没有标识名。我想从dataframe中找到一个特定的子字符串,然后获取紧跟在该子字符串后面的文本

注意:子字符串搜索中永远不会重复<学校2永远不会有两个例子:

数据帧的格式如下所示:

School 1: 1 Hour Delay
School 2: 2 Hour Delay
School 3: Closed
我希望能够搜索School 3:并返回状态,无论是关闭、延迟1小时还是延迟2小时

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

假设数据帧是这样的

                   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
然后,您可以通过列1的布尔索引检索列2的内容:

txt = 'School 3'
df.status[df.school==txt]

#2    Closed
#Name: status, dtype: object
假设只有一行始终符合此条件,则可以使用
str.extract

df.iloc[:,0].str.extract('(?<=School 3: )(.*)', expand=False).dropna().values[0]
# 'Closed'

df.iloc[:,0].str.extract('(?如果有多行与此字符串匹配怎么办?您会打印出什么?@coldspeed编辑了这篇文章来解释这一点。此表中不会有重复的字符串。在任何给定的时间内,只有一行包含此字符串。@coldspeed会有问题吗?在这种情况下为什么不返回几行?@Spighttcd我只是好奇OP希望如何处理它们它们实际上是有用的信息,所以我很想写一篇文章answer@MrShawn好的。下一个问题,有没有可能没有行符合这个条件?但是数据框只有一列,所以我无法从单独的列中获取状态。我需要找到文本“School 3:”是的,这个数据框只有一列,在这里称为
'status'
,第一行有
'School 1:1 Hour Delay'
的内容。我不知道在你的具体案例中它是如何被调用的,你没有发布它。啊,我将把它添加到主帖子中。这个列是真实的ly没有名字,只有数据值。所以它的名字是
0
?我不确定Pandas/Python是否使用0作为默认值,但是这个名字更像是nullI,我尝试了你的第一个方法,但得到了一个错误:AttributeError:'list'对象没有属性'iloc'@MrShawn Um?这不是很奇怪吗?
df
应该是一个数据帧,而不是一个列表ps您打算在实际上是您的数据帧的变量上运行此代码…除非我使用了错误的变量,否则这就是变量:df=pd.read_html(url)@MrShawn是的,您几乎做到了,但还不完全做到。出于任何原因,
read_html
返回一个列表。此列表的第一个元素是您的数据帧,因此请执行
df=pd.read_html(url)[0]
!啊,谢谢!我修正了一点,出现了一个新错误:索引器错误:索引0超出了大小为0的轴0的界限
try:
    status = (df.iloc[:,0]
                .str.extract('(?<=School 3: )(.*)', expand=False)
                .dropna()
                .values[0])    
except (IndexError, ValueError):
    status = np.nan