簡體   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