Python之所以能夠成為流行的數(shù)據(jù)分析語(yǔ)言,有一部分原因在于其簡(jiǎn)潔易用的字符串處理能力。
讓客戶(hù)滿意是我們工作的目標(biāo),不斷超越客戶(hù)的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶(hù),將通過(guò)不懈努力成為客戶(hù)在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名注冊(cè)、虛擬主機(jī)、營(yíng)銷(xiāo)軟件、網(wǎng)站建設(shè)、平房網(wǎng)站維護(hù)、網(wǎng)站推廣。
Python的字符串對(duì)象封裝了很多開(kāi)箱即用的內(nèi)置方法,處理單個(gè)字符串時(shí)十分方便;對(duì)于Excel、csv等表格文件中整列的批量字符串操作,pandas庫(kù)也提供了簡(jiǎn)潔高效的處理函數(shù),幾乎與內(nèi)置字符串函數(shù)一一對(duì)應(yīng)。也就是說(shuō):
單個(gè)字符串處理,用Python內(nèi)置的字符串方法;
表格整列的字符串處理,用pandas庫(kù)中的字符串函數(shù);
本文就以常用的數(shù)據(jù)處理需求,來(lái)對(duì)比使用以上兩種方式的異同,從而加深對(duì)Python
和pandas
字符串操作的理解。(本文所有數(shù)據(jù)都是為了演示用的假數(shù)據(jù),切勿當(dāng)真?。?/p>
)
場(chǎng)景:在問(wèn)卷收集的姓名字段中,不少填寫(xiě)者會(huì)誤輸入空格,造成數(shù)據(jù)匹配不一致的問(wèn)題。
names='劉備、關(guān)羽、張飛、趙云、馬超、黃忠'
names=names.replace('','')
print(names)
output
劉備、關(guān)羽、張飛、趙云、馬超、黃忠
df['姓名']=df['姓名'].str.replace('','')
output
場(chǎng)景:在問(wèn)卷收集數(shù)據(jù)的時(shí)候,多選題的數(shù)據(jù)往往是帶有分隔符的。在分類(lèi)匯總前往往需要按分隔符進(jìn)行分列。
hobbyStr="足球┋排球┋羽毛球┋籃球"
hobbyList=hobbyStr.split('┋')
output
['足球','排球','羽毛球','籃球']
#利用split進(jìn)行分列,expand=True返回dataframe;expand=False返回Series
hobbyDf=df['愛(ài)好'].str.split('|',expand=True)
#將hobbyDf與df安裝索引合并
df2=pd.merge(df,hobbyDf,how="left",left_index=True,right_index=True)
字符串是由一個(gè)個(gè)字符組成的序列,在Python中可以直接對(duì)字符串進(jìn)行切片操作,來(lái)進(jìn)行截取數(shù)據(jù)。
如“XX市四季家園二區(qū)22幢203室”,可以看作是下圖中16個(gè)字符值組成的序列。而切片的語(yǔ)法是:
addressStr="XX市四季家園二區(qū)22幢203室"
print(f"城市:{addressStr[:3]}")
print(f"小區(qū):{addressStr[3:9]}")
output
城市:XX市
小區(qū):四季家園二區(qū)
df["城市"]=df["地址"].str[:3]
正則表達(dá)式
。詳細(xì)處理方法,見(jiàn)下文五、正則表達(dá)式
示例1。有時(shí)候,我們?cè)陔娔X中按文件名排序的時(shí)候,你可能會(huì)遇到下面的情況:
在不同系統(tǒng)中,我們希望是按數(shù)值排序,但偏偏系統(tǒng)卻是按字符排序的,如某些車(chē)載播放器中。比較好的解決方法就是在前面添加0,補(bǔ)齊數(shù)據(jù)位數(shù)。數(shù)據(jù)量大的時(shí)候,手動(dòng)修改很麻煩,Python字符串處理的zfill()
函數(shù)就可以解決這個(gè)問(wèn)題。
myStr="1章節(jié)"
print(myStr.zfill(4))#整個(gè)字符串補(bǔ)齊到4位
output
01章節(jié)
df["新文件名"] = "第"+df["文件名"].str[1:].str.zfill(8)
配合os.rename()
便可以批量重命名。關(guān)鍵代碼如下
df.apply(lambdax:os.rename(path+x["文件名"],path+x["新文件名"]),axis=1)
遇到復(fù)雜的字符串處理需求時(shí),Python有優(yōu)勢(shì)就可以體現(xiàn)出來(lái)了。因?yàn)閜ython和pandas有一個(gè)超強(qiáng)的字符串處理武器:正則表達(dá)式。正則表達(dá)式可以匹配字符串的格式特點(diǎn),如電子郵箱的地址格式、網(wǎng)址的地址格式、電話號(hào)碼格式等。如何寫(xiě)好正則表達(dá)式,這是一門(mén)精深的學(xué)問(wèn),本文介紹幾個(gè)正則表達(dá)式的常用案例,淺嘗輒止。
注:Python默認(rèn)不支持正則表達(dá)式語(yǔ)法,而pandas直接支持正則表達(dá)式語(yǔ)法,這里重點(diǎn)介紹pandas處理表格數(shù)據(jù)。
思路:
提取上面小區(qū)名,可以歸納一下地址中小區(qū)名的格式特點(diǎn):蘇州市之后,幢號(hào)數(shù)字之前的中文字符
。
Series
的str.extract()
,可用正則從字符數(shù)據(jù)中抽取匹配的數(shù)據(jù);
##匹配中文字符的正則表達(dá)式:[\u4e00-\u9fa5]
pattern=r'蘇州市([\u4e00-\u9fa5]+)[0-9]+幢'
df["小區(qū)"]=df["地址"].str.extract(pattern,expand=False)
思路:幾幢幾室,格式都是數(shù)字+幢
和數(shù)字+室
[0-9]
或\d
來(lái)匹配;+
表示1個(gè)或多個(gè)。pattern=r'([0-9]+)幢'
df["幢號(hào)"]=df["地址"].str.extract(pattern,expand=False)
pattern=r'(\d+)室'
df["室號(hào)"]=df["地址"].str.extract(pattern,expand=False)
apply 函數(shù):可以對(duì)DateFrame
進(jìn)行逐行或逐列進(jìn)行處理。
將幢號(hào)為奇數(shù)的為A區(qū),偶數(shù)的為B區(qū)
#定義處理的函數(shù),共apply函數(shù)調(diào)用,傳入的參數(shù)為一個(gè)Series對(duì)象
defmy_func(series):
if(series["幢號(hào)"])%2!=0:
return"A區(qū)"
else:
return"B區(qū)"
df["幢號(hào)分類(lèi)"]=df.apply(my_func,axis=1)
上述代碼中apply函數(shù),有兩個(gè)參數(shù)
my_func
;axis = 1
,表示按列處理。即傳入的是每一行的Series
。output
defmy_func2(series):
#映射字典,key為小區(qū)名,value為小區(qū)稱(chēng)號(hào)
my_dict={
'吉祥如意家園':'最佳好運(yùn)小區(qū)',
'科技村':'最佳科創(chuàng)小區(qū)',
'四季家園':'最佳風(fēng)光小區(qū)',
'萬(wàn)象更新家園':'最佳風(fēng)采小區(qū)',
}
#每一行小區(qū)名稱(chēng),切片截取至倒數(shù)第2個(gè),即-2
nameKey=series['小區(qū)'][:-2]
returnmy_dict[nameKey]
df["小區(qū)稱(chēng)號(hào)"]=df.apply(my_func2,axis=1)
output
本文演示的字符串操作:替換
、分列
、切片截取
、補(bǔ)齊數(shù)據(jù)
、正則表達(dá)式
、apply()函數(shù)
常見(jiàn)于數(shù)據(jù)分析的數(shù)據(jù)清洗環(huán)節(jié),替換
、分列
、切片截取
在Excel中也很容易實(shí)現(xiàn),正則表達(dá)式
可以說(shuō)是Python處理復(fù)雜字符串問(wèn)題的一大利器,apply()函數(shù)
可以實(shí)現(xiàn)自定義函數(shù)
處理表格型的數(shù)據(jù),十分靈活、威力巨大。由于篇幅有限,正則表達(dá)式
、apply()函數(shù)
本文就點(diǎn)到為止,今后值得整理更多相關(guān)案例。