Panda处理文本和时序数据?首选向量化
前言
Pandas作為Python數(shù)據(jù)分析的首選框架,不僅功能強大接口豐富,而且執(zhí)行效率也相比原生Python要快的多,這是得益于Pandas底層由C實現(xiàn),同時其向量化執(zhí)行方式也非常利于并行計算。更重要的是,這種向量化操作不僅適用于數(shù)值計算,對于文本和時間格式也有著良好的支持,而這就不得不從Pandas的屬性接口談起。
?
?
說起Pandas中的屬性接口,首先要從數(shù)據(jù)類型談起。在任何一門編程語言中,雖然各自的數(shù)據(jù)類型有很多,比如數(shù)值型有int、long、double,字符串有str或者char類型,還有時間數(shù)據(jù)類型以及布爾數(shù)據(jù)類型等,可以說這數(shù)值型、字符串型、時間型以及布爾型基本覆蓋了所有基本的數(shù)據(jù)類型。而像其他的數(shù)組、列表、字典等則都是集合類的數(shù)據(jù)結(jié)構(gòu),不屬于基本數(shù)據(jù)類型。
數(shù)值型操作是所有數(shù)據(jù)處理的主體,支持程度自不必說,布爾型數(shù)據(jù)在Pandas中其實也有較好的體現(xiàn),即通過&、|、~三種位運算符也相當(dāng)于是實現(xiàn)了向量化的并行操作,那么對于字符串和時間格式呢?其實這就是本文今天要分享的重點內(nèi)容:屬性接口——str、dt,兩類接口均用幾個小例子簡單粗暴的進行示范,即學(xué)即用!
嚴格意義上講,Pandas中的屬性接口除了str和dt外,還有枚舉類型cat接口,但其實用法很小眾,所以本文不予提及。
01 字符串接口——str
在Pandas中,當(dāng)一列數(shù)據(jù)類型均為字符串類型時,則可對該列執(zhí)行屬性接口操作,即通過調(diào)用.str屬性可調(diào)用一系列的字符串方法函數(shù),其中這里的字符串方法不僅涵蓋了Python中內(nèi)置的字符串通用方法,比如split、strim等,還實現(xiàn)了正則表達式的絕大部分功能,包括查找、匹配和替換等、這對于Pandas處理文本數(shù)據(jù)來說簡直是開掛一般的存在。
舉個例子,例如構(gòu)造如下虛擬DataFrame數(shù)據(jù),其中所有列都用到了字符串類型:
df = pd.DataFrame({ "name":['GuanYu', 'zhangFei', 'zhao-yun', 'machao', 'huangzhong#'], "city":['湖北省荊州市', '四川省漢中市', '四川省成都市', '甘肅省西涼區(qū)', '四川省成都市'], "salary":['30-50K', '30-50k', '30-45k', '30-40k', '30-40k'], "helpers":['關(guān)平 周倉 廖化 馬良', '張苞 魏延', '馬云祿', '馬岱 龐德', '嚴顏']})對應(yīng)數(shù)據(jù)表如下:
觀察數(shù)據(jù)可見,name列字符串格式不是很統(tǒng)一,既有大小寫混亂,也有-、#等其他無用字符,city列相對規(guī)整,但馬超所在列不是xx省xx市結(jié)構(gòu),而salary均有薪資上下限組成,最后helpers列則是一個復(fù)合類型,各部下之間用空格進行區(qū)分。針對這一數(shù)據(jù),需要完成如下處理需求:
-
規(guī)整姓名列,均變?yōu)樾懶问角疫^濾無用字符
-
提取所在城市信息
-
計算平均薪資
-
提取部下人數(shù)信息
對于以上需求,用Pandas實現(xiàn)都非常之容易:
-
姓名列統(tǒng)一小寫,然后過濾掉非字母的字符,其中l(wèi)ower是Python字符串內(nèi)置的通用方法,replace雖然是Pandas中的全局方法,但嵌套了一層str屬性接口后即執(zhí)行正則匹配的替換,這里即用到了正則表達式的匹配原則,即對a-z字母以外的其他字符替換為空字符:
-
根據(jù)正則表達式,提取省市之間的城市信息,特別地,第二個關(guān)鍵詞還可能是區(qū),所以可用正則表達式中的findall提取功能,還需注意提取的限定關(guān)鍵字為前面以"省"開頭、后面以"市"或"區(qū)"結(jié)束的中間字符,即是城市信息:
-
計算平均薪資。由于這里的薪資字段其實還是比較規(guī)整的,即都是以K結(jié)尾(雖然可能有大小寫之別),薪資上下限用-連接,所有其實有多種方法可以實現(xiàn),這里舉例其中的兩種,其中第一種用到了字符串的切分函數(shù),第二種方法仍然是正則匹配查找。兩種方法均實現(xiàn)了兩個數(shù)字的提取,進而可以完成上下限的均值計算。
-
最后是提取下屬信息,注意到這里的下屬由一個字符串組成,且下屬之間由空格間隔。針對這一需求,也可輕松實現(xiàn)兩種解決方案,其中之一是進行拆分然后獲取拆分后列表的長度、第二種是直接對字符串中空格進行計數(shù),而后+1即為總的部下人數(shù)。兩種方案結(jié)果是一致的:
以上,舉了幾個簡單的例子對pandas中的字符串屬性接口str進行了牛刀小試,其中包括python內(nèi)置的字符串函數(shù)split、count、len等,也包括findallreplace中嵌套正則表達式等用法,靈活運用起來效率真的是可以起飛……
最后,給出str中的所有屬性接口函數(shù):
基本都是Python中常用的字符串函數(shù),調(diào)用時只需在一個字符串列后調(diào)用str即可,方法簡單,但效率卻是異常明顯的。
02 時間屬性接口——dt
與str用法極其類似、對時間類型的數(shù)據(jù)處理極為友好的另一個屬性接口是dt,即datetime的簡稱,要求適用于格式是時間類型的數(shù)據(jù)。由于時間類型在某些特定應(yīng)用場景還是非常常用的,所以靈活運用dt屬性接口也可實現(xiàn)非常便捷的數(shù)據(jù)處理操作。
這里首先仍然給出示例數(shù)據(jù):
以上述時間序列數(shù)據(jù)為例,通過dt時間屬性接口可以很容易的實現(xiàn)各類時間信息的提取,例如提取年份、日期和時間信息即可分別調(diào)用year、date和time屬性即可。
這里需要注意的是,在前述str屬性接口中,多數(shù)dt后面接的都是函數(shù),而這里獲取的year、date和time等都是屬性(因為無需參數(shù)),二者的區(qū)別體現(xiàn)為函數(shù)以()結(jié)尾,而屬性則無需括號。
但dt屬性接口基本上都是這種屬性接口,但也有一些是函數(shù),例如指定類型的格式化
完整的接口清單如下:
基本上,時間格式中想得到的、想不到的基本都給予了實現(xiàn),用來提取個時間信息簡直是太方便了。
03 小結(jié)
一門編程語言中的基本數(shù)據(jù)類型無非就是數(shù)值型、字符串型、時間型以及布爾型,Pandas為了應(yīng)對各種數(shù)據(jù)格式的向量化操作,針對字符串和時間格式數(shù)據(jù)專門提供了str和dt兩個屬性接口(數(shù)值型數(shù)據(jù)天然支持向量化操作,而布爾型也可通過位運算符&、|、~實現(xiàn)并行計算),通過調(diào)用屬性接口后的系列方法,可以實現(xiàn)豐富的API以及高效的計算能力。尤其是字符串型數(shù)據(jù),除了Python中通用的字符串方法外,還集成了正則表達式處理邏輯。
另外,除了str和dt兩個屬性接口外還有一個枚舉屬性接口cat(即category縮寫),但實際上用處較為局限。
總結(jié)
以上是生活随笔為你收集整理的Panda处理文本和时序数据?首选向量化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python应用实战-Python爬取4
- 下一篇: Python应用实战- 爬虫基础入门知识