公眾號:尤而小屋
作者:Peter
編輯:Peter
大家好,我是Peter~
今天給大家介紹兩個Pandas中處理文本數(shù)據(jù)的函數(shù),主要功能是從文本內(nèi)容中提取想要的信息:extract + extractall
extract函數(shù)
語法說明
extract函數(shù)的具體使用形式如下嫁怀,只有3個參數(shù):
Series.str.extract(pat, flags=0, expand=None)
參數(shù)的具體解釋為:
- pat:字符串或者正則表達(dá)式
- flags:整型
- expand:布爾值溉愁,是否返回DataFrame维蒙;T-是,F(xiàn)-否
模擬數(shù)據(jù)
我們看看一個官網(wǎng)提供的簡單案例剂邮,下面是模擬的數(shù)據(jù)Series:
匹配1
在下面的例子中,匹配了兩組模式的數(shù)據(jù)横侦;一對()
表示匹配一組:
- [ab]:表示從ab字母中任意匹配一個
- \d:表示匹配一個數(shù)字
通過結(jié)果挥萌,我們可以發(fā)現(xiàn)2點(diǎn):
- 當(dāng)匹配多組規(guī)則的時候,如果沒有匹配成功枉侧,則用NaN來代替
- 當(dāng)?shù)谝唤M模式?jīng)]有匹配成功的時候,第二組匹配無效
關(guān)于第2點(diǎn):在c3
中雖然后面的\d
匹配到了數(shù)字,但是前面的[ab]
是沒有匹配成功的纽门,c
不滿足ab中的任意一個酝陈,所以最終整體還是NaN
匹配2
下面的匹配和上面的區(qū)別在于多個了問號?
,結(jié)果卻不同
在進(jìn)行正則匹配的時候翼虫,問號?
表示匹配前面元素的1個或者0個屑柔。所以在c3
中,[ab]
可以說是匹配到了0個珍剑,用NaN代替掸宛,也是匹配成功
匹配3
在匹配的時候指定列名,生成最終的DataFrame:
列名的指定使用?P<column>
參數(shù)expand使用
關(guān)于參數(shù)expand的使用:
- expand = True:返回的是DataFrame
- expand = False:返回的是Series或者Index
通過下面兩個例子的比較招拙,我們就能夠觀察到expand的作用:
extractall函數(shù)
語法說明
extract只返回第一個匹配到的字符唧瘾;extractall將匹配所有返回的字符
Series.str.extractall(pat, flags=0)
參數(shù)的具體解釋為:
- pat:字符串或者正則表達(dá)式
- flags:整型
返回值一定是一個DataFrame數(shù)據(jù)框
模擬數(shù)據(jù)
下面是模擬了一份新的數(shù)據(jù):
下面通過3個例子來對比兩個函數(shù)的區(qū)別:
對比1
單組模式下的匹配
對比2
多組模式下的匹配:
對比3
多組模式下的匹配,且加上列名:
實(shí)戰(zhàn)案例
下面通過一個實(shí)際的案例來講解如何使用extract函數(shù):
模擬數(shù)據(jù)
name字段中其實(shí)是同時包含了姓名和性別兩個信息别凤,address字段中同時包含了省份和城市:
df = pd.DataFrame({
"name":["Tom-male","Peter male","Jimmy-female","Mike male","John-female"],
"address":["廣東省深圳市","廣東省廣州市","浙江省杭州市","江蘇省南京市","湖南省長沙市"]}
)
df
提取省份
快速提取地址address中的省份信息饰序,其中.*?
表示匹配任意內(nèi)容
提取省份+城市
同時提取省份+城市,還可以指定列名信息:
提取名字+性別
從字段name中將姓名和性別同時提取出來闻妓,\w
表示匹配一個字母菌羽,+
表示匹配多個字符
正則匹配小知識
在這里簡單介紹一點(diǎn)關(guān)于正則匹配的小知識,下面內(nèi)容來自谷歌分析:
通配符
. | 匹配任何單個字符(字母、數(shù)字或符號) | 1. 可以匹配 10注祖、1A 1.1 可以匹配 111猾蒂、1A1 |
---|---|---|
? | 匹配前面的字符 0 次或 1 次 | 10? 可以匹配 1、10 |
+ | 匹配前面的字符 1 次或多次 | 10+ 可以匹配 10是晨、100 |
* | 匹配前面的字符 0 次或多次 | 1* 可以匹配 1肚菠、10 |
| | 創(chuàng)建 OR(或)匹配 請勿在表達(dá)式末尾使用 | 1|10 可以匹配 1、10 |
定位符
^ | 匹配位于字符串開頭的相鄰字符 | ^10 可以匹配 10罩缴、100蚊逢、10x ;無法匹配 110箫章、110x |
---|---|---|
$ | 匹配位于字符串結(jié)尾的相鄰字符 | 10$ 可以匹配 110烙荷、1010 ;無法匹配 100檬寂、10x |
問號 (?)
問號 (?) 匹配前面的字符 0 次或 1 次终抽。例如,10? 可以匹配:
- 1 : 問號前面的0匹配了0次
- 10 : 問號前面的0匹配了1次
加號 (+)
加號 (+) 匹配前面的字符 1 次或多次桶至。例如昼伴,10+ 可以匹配:
- 10 : 0匹配一次
- 100 : 0匹配兩次
- 1000 : 0匹配三次
星號 (*)
星號 (*) 匹配前面的字符 0 次或多次。例如镣屹,10* 可以匹配:
- 1 :前面的0匹配0次
- 10 : 匹配1次
- 100
- 1000
后面寫一篇詳細(xì)的基于Python中的re模塊的正則匹配文章圃郊,下期見~