99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀傻傻分不清系列 | python中各種字符串處理方法
傻傻分不清系列 | python中各種字符串處理方法
2020-05-25
收藏

python易混淆知識系列:pandas字符串方法和字符串內(nèi)建函數(shù),使用python的一個優(yōu)勢就是字符串處理起來比較容易。

Python的初學(xué)者在學(xué)習(xí)字符串內(nèi)建函數(shù)的時候往往會很困惑:字符串的內(nèi)建函數(shù)是對單個字符串對象處理,如果要對成千上萬個字符串對象處理該怎么辦?

不少已經(jīng)使用Python工作很長時間的同學(xué),即使已經(jīng)學(xué)會使用Pandas對象的.apply()方法來處理字符串,依然會時常忘記:其實Pandas已經(jīng)自帶功能強大的向量化字符串操作。

即使知道Pandas字符串方法的同學(xué),使用的時候也經(jīng)常與字符串內(nèi)建函數(shù)混淆。

而熟練使用Pandas字符串方法的同學(xué)往往會覺得,其方法的代碼簡潔性與運行效率都遠高于其他的寫法。真相到底如何?Pandas字符串方法和字符串內(nèi)建函數(shù)有什么不同?運算效率真的像傳聞那么高嗎?

今天我們就好好捋一下這塊Python易混淆的知識點。

1. 快速入門向量化字符串操作

初學(xué)Python字符串內(nèi)建函數(shù)的同學(xué)肯定知道有個叫.lower()的方法可以將字符串中的大寫英文字母轉(zhuǎn)化為小寫,比如將字符串對象’ABCD’轉(zhuǎn)化為小寫:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

如果字符型的Series對象中的字符串要轉(zhuǎn)化為小寫呢?比如:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

此時,我們就可以使用Series的str方法中的.lower()來處理:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

同理,如果要將Series對象中的所有的大寫字母變成小寫,可以使用.str.upper()。

看到這里,相信很多沒有使用過Pandas字符串方法的同學(xué)會驚奇地發(fā)現(xiàn),這跟字符串對象的內(nèi)建函數(shù)差不多呀?只不過多了一個通過.str()方法調(diào)用函數(shù)的過程。

確實,大多數(shù)Pandas的字符串方法借鑒了Python字符串內(nèi)建函數(shù)的內(nèi)容,這里給大家梳理一下,兩種處理字符串方法基本相同的地方:

· 求字符串長度

§ .str.len()

· 字符檢索

§ .str.find()和.str.rfind()

§ .str.index()和.str.rindex()

· 字符轉(zhuǎn)換

§ .str.lower()和.str.upper()

§ .str.title()和.str.capitalize()

§ .str.swapcase()

· 字符類型判斷

§ .str.islower()和.str.isupper()

§ .str.isnumeric()、.str.isalnum()、.str.isdecimal()、.str.isalpha()、.str.isdigit()

§ .str.isspace()

§ .str.istitle()

· 字符對齊與填充

§ .str.startswith()和.str.endswith()

§ .str.center()

§ .str.ljust()和.str.rjust()

· 字符分隔

§ .str.split()和.str.rsplit()

§ .str.partition()和.str.rpartition()

· 字符整理

§ .str.strip()、.str.rstrip()、.str.lstrip()

以上方法都是Pandas字符串方法與Python字符串內(nèi)建函數(shù)中基本一致的部分,無論是方法名還是調(diào)用過程,只有少部分有少許區(qū)別。

2. 其他字符串方法

除了與字符串內(nèi)建函數(shù)類似的方法以外,Pandas還有一些功能強大的字符串方法。

(1) 向量化字符串的取值和切片操作

很多同學(xué)會很疑惑,字符串對象可以進行取值和切片操作,但是Pandas對象中的字符串如何進行相同的操作?比如以上面的Series對象為例:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

如果想把上面Series對象中所有字符串中的前三個字母取出來,可以通過調(diào)用.str屬性后,返回的對象直接使用和字符串切片一樣的方法:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

此外還可以使用.str.slice()方法,其參數(shù)與切片方法的類似:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

但是如果想根據(jù)字符串索引來取單個字符元素,可以通過.str.get()方法來進行。比如上面的Series對象a中,我們想要取里面所有字符串索引值為1的元素,可以寫a.str.get(1):

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

(2) 字符串拼接

Python中多個字符串對象拼接非常簡單,直接使用加法運算符就可以了,比如:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

這種便捷的方法,Series對象也同樣沿用下來,可以將多個字符型Series對象用加法運算符直接相加:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

但是Pandas字符串方法中有更加強大的字符串拼接功能,那就是.str.cat()方法。

實現(xiàn)上面同樣的字符串拼接,如果我們使用.str.cat()方法,可以這樣寫:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

也就是說,第一個Series對象調(diào)用.str.cat()方法,該方法第一個參數(shù)可以用列表的形式來把其他需要合并的Series對象寫進來。

當然,.str.cat()方法功能強大,比如可以選擇使用參數(shù)sep來自定義分隔符來合并,我們使用“|”來連接上面的三個Series對象:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

(3) 字符替換操作

字符串內(nèi)建函數(shù)有便捷的字符替換方法.replace(),比如我們想字符串’abcd’中的’a’替換成’A’:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

同樣地,Pandas字符串方法也有一樣的操作:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

當然,如果想通過索引值或者切片來指定替換呢?比如我們想將str_01中的所有字符串中索引值0到2的元素替換成符號‘*’,我們就需要使用.str.slice_replace(),替換對象以參數(shù)repl來指定:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

(4) 快速獨熱編碼

獨熱編碼無論在特征工程中還是問卷數(shù)據(jù)處理中都應(yīng)用廣泛,我們需要轉(zhuǎn)碼的字符如下圖表示,該怎么辦?

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

想看到這,熟練使用Pandas的apply()方法的同學(xué)會開始絞盡腦汁寫自定義函數(shù)來完成這么復(fù)雜的編碼規(guī)則。其實,我們可以直接使用Pandas字符串方法.str.get_dummies()來完成獨熱編碼,如下:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

如果非常不幸,我們的字符串中的分隔符”|”都不存在,該怎么辦?

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

此時我們可以使用搭配使用.str.join()方法,將“|”插入到上面Series對象中每個字符串對象的每個元素之間:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

上面生成的對象最后再次調(diào)用.str.get_dummies()方法即可:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

3. 代碼量與運算效率PK

從上面我們可以看到,Pandas的字符串方法實現(xiàn)了很多我們意想不到的操作的同時,大大簡化了代碼書寫的復(fù)雜程度。

接下來,我們對比一下,在文本數(shù)據(jù)量較大的時候,使用Pandas字符串方法和使用字符串內(nèi)建函數(shù),在代碼量上和代碼運算效率上作一番比較。

我們以最為常用的幾個使用場景來舉例子,分別是字符切片、替換、拼接、去除前后特殊字符。

下面用到的內(nèi)存分析魔法函數(shù),需要先在pip安裝擴展memory_profiler:

pip install memory_profiler

然后還需要在notebook中導(dǎo)入這個擴展:

%load_ext memory_profiler

(1) 字符串切片方法對比

我們先建立一個長度為一千萬的字符型Series對象:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

我們嘗試使用兩種方法,對Series對象中的所有字符對象取前兩個元素:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

上面我們會發(fā)現(xiàn)第一種方法使用列表推導(dǎo)式配合字符串切片方法,會比第二種使用Pandas字符串方法占用內(nèi)存要大且運算時間稍慢。

同時,Pandas字符串方法的代碼簡潔很多。

(5) 字符串替換方法對比

同理按照以上的方法,我們對比一下兩種字符串方法的在字符串替換上的運算效率:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

上圖可以看到,無論是代碼簡潔性、可閱讀性,還是運算效率方面,Pandas的字符串方法都要好很多。

(6) 字符串拼接方法對比

多個字符型Series對象拼接在一起,同時使用分隔符“|”拼接,我們對比一下兩種寫法:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

可以看到在拼接方法上,雖然代碼的簡潔性與拓展性,Pandas的字符串方法要好很多,但是其運算效率要比第一種方法要低很多。

這主要是因為第一種方法使用了廣播機制,加快了運算效率。

(7) 去除前后特殊字符

去除字符串前后的特殊字符,比如空格,是字符串處理的常見操作,我們看看使用Pandas的.str.strip()方法是否在各方面要好很多。

先建一個例子:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

第一種方法我們依然使用列表推導(dǎo)式與字符串內(nèi)建函數(shù):

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

第二種方法:

傻傻分不清系列 | Python中各種字符串處理方法

點擊添加圖片描述(最多60個字)編輯

第二種方法我們會看到,雖然運算時間稍微比第一種方法高了一點,但是代碼簡潔性和可閱讀性要比第一種方法好很多,而且運算內(nèi)存消耗要低很多。

4. 小結(jié)

從上面這么多的例子我們會發(fā)現(xiàn),Pandas的字符串方法無論是在代碼可閱讀性還是運算效率方面,在實現(xiàn)各種字符串處理場景時,基本上都要比其他方法要好很多。而在實現(xiàn)特定字符串處理場景,比如獨熱編碼時,Pandas特有的字符串方法就更加便捷。

作為實用主義者,我們在處理文本數(shù)據(jù)的時候,可以優(yōu)先使用Pandas字符串方法。遇到尤為棘手的處理需求時,結(jié)合字符串內(nèi)建函數(shù)與Pandas的apply(),你就可以建立一個功能強大無比的字符串處理程序來清洗自己數(shù)據(jù)了。

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }