一、extractall函數概述
extractall是Python中pandas庫提供的一個方法,在DataFrame和Series上均可使用。它可以將正則表達式所匹配到的數據全部提取出來,並按照指定的格式返回。
例如,我們可以將一個CSV文件,以DataFrame的形式讀入到內存中,然後再使用extractall方法,按照給定的正則表達式,提取其中一些需要的數據。這樣就可以在方便地查看DataFrame數據的前提下,提取出我們想要的數據進行進一步的處理。
二、extractall函數的使用方法
extractall方法的基本用法如下:
DataFrame/Series.str.extractall(pattern, flags=0)
其中,pattern為正則表達式字符串,flags表示正則表達式的標記。
下面是一個示例:
import pandas as pd
data = {'text': ['bar 4', 'foo ab12ba foo 5']}
df = pd.DataFrame(data)
result = df['text'].str.extractall('(\\d)')
print(result)
上述代碼將輸出:
0
0 4
1 1
1 2
1 5
從輸出結果可以看出,正則表達式“(\\d)”匹配到了dataframe中的若干個數字,將它們提取出來,並以MultiIndexed DataFrame的形式返回。
三、extractall函數的進階用法
1. 指定正則表達式的分組
在上述的示例中,我們簡單地使用了“(\\d)”這個正則表達式。但是實際上,我們可以使用更為複雜的正則表達式,並且將其分為多個組,以方便進行更細粒度的數據提取。
例如,我們可以使用以下代碼:
import pandas as pd
data = {'text': ['bar e=mc2', 'foo a1b2c3 foo 567']}
df = pd.DataFrame(data)
result = df['text'].str.extractall('([a-z]+)\\s*(\\d+)?')
print(result)
上述代碼將輸出:
0 1
match
0 0 bar NaN
1 NaN NaN
2 NaN NaN
3 NaN NaN
1 0 foo 1
1 NaN 2
2 NaN 3
3 NaN 567
我們使用的正則表達式”([a-z]+)\\s*(\\d+)?”,可以分為兩個組:
- 第一個組:匹配一個或多個字母。
- 第二個組:匹配一個或多個數字,但也可以不匹配。
在extractall方法調用中,我們仍然使用“(\\d)”將正則表達式中匹配到的數字提取出來。但是由於正則表達式中分為了兩個組,因此在返回MultiIndexed DataFrame時,結果也分為了兩列。
2. 指定DataFrame列標籤
在extractall方法中,我們使用的是pandas庫中的DataFrame、Series數據格式,因此結果也會以這種格式返回。
但是有時我們在進行數據提取、存儲時,希望將結果保存到不同列中,以便於後續處理。
為了實現這一目標,我們可以使用在extractall方法中添加可選參數“column_labels”來指定列標籤:
import pandas as pd
data = {'text': ['bar e=mc2', 'foo a1b2c3 foo 567']}
df = pd.DataFrame(data)
result = df['text'].str.extractall('(?P[a-z]+)\\s*(?P\\d+)?', flags=re.IGNORECASE)
result.columns = result.columns.droplevel(level=1)
print(result)
上述代碼將輸出:
letter number
0 bar NaN
1 foo 1
1 foo 2
1 foo 3
1 foo 567
我們可以注意到,在正則表達式中,我們使用了“(?’name’pattern)”這種語法,指定了分組的名稱。在extractall方法之後,我們使用了“result.columns.droplevel(level=1)”將columns中的“match”一級刪除,以便於之後直接使用分組名稱進行訪問。
3. 在提取時依據之前的匹配結果進行組合
在extractall方法中,我們不僅可以進行簡單的數據提取,還可以根據之前已經匹配到的結果,進行更為複雜的組合計算。
例如,我們可以使用以下代碼:
import pandas as pd
data = {'text': ['bar e=mc2', 'foo a1b2c3 foo 567']}
df = pd.DataFrame(data)
result = df['text'].str.extractall('(?P[a-z]+)\\s*(?P\\d+)?')
result['new_column'] = result['letter'].str.upper() + '-' + result['number'].fillna('')
print(result)
上述代碼將輸出:
letter number new_column
0 bar NaN BAR-
1 foo 1 FOO-1
1 foo 2 FOO-2
1 foo 3 FOO-3
1 foo 567 FOO-567
由於我們之前已經對正則表達式進行了分組,“(?P[a-z]+)”和“(?P\\d+)?”,因此我們可以在提取結果之後,根據已經獲取的匹配結果,進行更為複雜的數據計算,進一步提高數據的精度。
四、總結
extractall函數是Python中一個強大的數據提取工具,能夠方便地幫助我們從DataFrame、Series等數據類型中,提取出需要的數據。在使用extractall函數時,我們可以指定正則表達式及其分組,指定列標籤以方便後續計算,同時,在提取結果時也可以根據之前匹配到的結果進行進一步的組合計算。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/206928.html