Pandas借助Numpy實(shí)現(xiàn)優(yōu)化的條件檢索代碼
Numpy
其實(shí)是最早的處理數(shù)據(jù)的Python
庫(kù),它的核心ndarray
對(duì)象,是一個(gè)高效的n維數(shù)組結(jié)構(gòu)。
通過(guò)這個(gè)庫(kù),可以高效的完成向量和矩陣運(yùn)算,由于其出色的性能,很多其他的數(shù)據(jù)分析,科學(xué)計(jì)算或者機(jī)器學(xué)習(xí)相關(guān)的Python
庫(kù)都或多或少的依賴于它。
Pandas
就是其中之一,Pandas
充分利用了NumPy
的數(shù)組運(yùn)算功能,使得數(shù)據(jù)處理和分析更加高效。
比如,Pandas
中最重要的兩個(gè)數(shù)據(jù)結(jié)構(gòu)Series
和DataFrame
在內(nèi)部就使用了NumPy
的ndarray
來(lái)存儲(chǔ)數(shù)據(jù)。
在使用Pandas
進(jìn)行數(shù)據(jù)分析的過(guò)程中,按條件檢索和過(guò)濾數(shù)據(jù)是最頻繁的操作。
本文介紹兩種通過(guò)結(jié)合Numpy
,一方面讓Pandas的檢索過(guò)濾代碼更加簡(jiǎn)潔易懂,另一方面還能保障檢索過(guò)濾的高性能。
1. 準(zhǔn)備數(shù)據(jù)
第一步,先準(zhǔn)備數(shù)據(jù),這次使用二手房交易數(shù)據(jù),可從 https://databook.top/lianjia/nj 下載。
import pandas as pd import numpy as np # 這個(gè)路徑替換成自己的路徑 fp = r'D:\data\南京二手房交易\南京江寧區(qū).csv' df = pd.read_csv(fp) df.head()
2. 一般條件判斷(np.where)
比如,買房前我們想先分析下已有的成交信息,對(duì)于房?jī)r(jià)能有個(gè)大致的印象。
下面,按照總價(jià)和單價(jià),先挑選總價(jià)200~300萬(wàn)之間,或者單價(jià)1萬(wàn)以下的成交信息。
符合條件返回“OK”,否則返回“NG”。
def filter_data(row): if row["totalPrice"] > 200 and row["totalPrice"] < 300: return "OK" if row["unitPrice"] < 10000: return "OK" return "NG" df["評(píng)估"] = df.apply(filter_data, axis=1) df[df["評(píng)估"] == "OK"].head()
上面的過(guò)濾數(shù)據(jù)寫法是使用Pandas
時(shí)用的比較多的方式,也就是將過(guò)濾條件封裝到一個(gè)自定義函數(shù)(filter_data
)中,然后通過(guò) apply
函數(shù)來(lái)完成數(shù)據(jù)過(guò)濾。
下面我們用Numpy
的 np.where
接口來(lái)改造上面的代碼。
np.where
類似Python
編程語(yǔ)言中的if-else
判斷,基本語(yǔ)法:
import numpy as np np.where(condition[, x, y])
其中:
- condition:條件表達(dá)式,返回布爾數(shù)組。
- x 和 y:可選參數(shù),
condition
為True
,返回x
,反之,返回y
。
如果未提供x
和 y
,則函數(shù)僅返回滿足條件的元素的索引。
改造后的代碼如下:
# 根據(jù)單價(jià)過(guò)濾 cond_unit_price = np.where( df["unitPrice"] < 10000, "OK", "NG", ) # 先根據(jù)總價(jià)過(guò)濾,不滿足條件再用單價(jià)過(guò)濾 cond_total_price = np.where( (df["totalPrice"] > 200) & (df["totalPrice"] < 300), "OK", cond_unit_price, ) df["評(píng)估"] = cond_total_price df[df["評(píng)估"] == "OK"].head()
運(yùn)行之后返回的結(jié)果是一樣的,但是性能提升很多。
如果數(shù)據(jù)量是幾十萬(wàn)量級(jí)的話,你會(huì)發(fā)現(xiàn)改造之后的代碼運(yùn)行效率提高了幾百倍。
3. 復(fù)雜多條件判斷(np.select)
上面的示例中,判斷還比較簡(jiǎn)單,屬于if-else
,也就是是與否的判斷。
下面設(shè)計(jì)一種更復(fù)雜的判斷,將成交信息評(píng)估為“優(yōu)良中差”4個(gè)等級(jí),而不僅僅是“OK”和“NG”。
我們假設(shè):
- 優(yōu):房屋精裝,且位于中樓層,且近地鐵
- 良:總價(jià)<300,且近地鐵
- 中:總價(jià)<400
- 差:其他情況
用傳統(tǒng)的方式,同樣是封裝一個(gè)類似filter_data
的函數(shù)來(lái)判斷“優(yōu)良中差”4個(gè)等級(jí),然后用 apply
函數(shù)來(lái)完成數(shù)據(jù)過(guò)濾。
這里就不演示了,直接看結(jié)合Numpy
的np.select
接口,高效的完成“優(yōu)良中差”4個(gè)等級(jí)的過(guò)濾。
np.select
類似Python
編程語(yǔ)言中的match
匹配,基本語(yǔ)法:
numpy.select(condlist, choicelist, default=0)
其中:
- condlist:條件列表,每個(gè)條件都是一個(gè)布爾數(shù)組。
- choicelist:與 condlist 對(duì)應(yīng)的數(shù)組列表,當(dāng)某個(gè)條件為真時(shí),返回該位置對(duì)應(yīng)的數(shù)組中的元素。
- default:可選參數(shù),當(dāng)沒(méi)有條件為真時(shí)返回的默認(rèn)值。
# 設(shè)置 “優(yōu),良,中” 的判斷條件 conditions = [ df["houseInfo"].str.contains("精裝") & df["positionInfo"].str.contains("中樓層") & df["advantage"].str.contains("近地鐵"), (df["totalPrice"] < 300) & df["advantage"].str.contains("近地鐵"), df["totalPrice"] < 400, ] choices = ["優(yōu)", "良", "中"] # 默認(rèn)為 “差” df["評(píng)估"] = np.select(conditions, choices, default="差") df.head()
這樣,就實(shí)現(xiàn)了一個(gè)對(duì)成交信息的分類。
4. 總結(jié)
np.where
和 np.select
的底層都是向量化的方式來(lái)操作數(shù)據(jù),執(zhí)行效率非常高。
所以,我們?cè)谑褂肞andas分析數(shù)據(jù)時(shí),應(yīng)盡量使用np.where
和 np.select
來(lái)幫助我們過(guò)濾數(shù)據(jù),這樣不僅能夠讓代碼更加簡(jiǎn)潔專業(yè),而且能夠極大的提高分析性能。
到此這篇關(guān)于Pandas借助Numpy實(shí)現(xiàn)優(yōu)化的條件檢索代碼的文章就介紹到這了,更多相關(guān)Pandas Numpy優(yōu)化條件檢索內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python如何解決secure_filename對(duì)中文不支持問(wèn)題
最近使用到了secure_filename,然后悲劇的發(fā)現(xiàn)中文居然不展示出來(lái),本文就詳細(xì)的介紹一下解決方法,感興趣的可以了解一下2021-07-07Python pymysql連接數(shù)據(jù)庫(kù)并將查詢結(jié)果轉(zhuǎn)化為Pandas dataframe
這篇文章主要為大家介紹了Python pymysql連接數(shù)據(jù)庫(kù)并將結(jié)果轉(zhuǎn)化為Pandas dataframe實(shí)現(xiàn)方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Python?SDK實(shí)現(xiàn)私服上傳下載的示例
本文主要介紹了Python?SDK實(shí)現(xiàn)私服上傳下載的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下<BR>2021-11-11Python實(shí)現(xiàn)壓縮文件夾與解壓縮zip文件的方法
這篇文章主要介紹了Python實(shí)現(xiàn)壓縮文件夾與解壓縮zip文件的方法,涉及Python使用zipfile模塊進(jìn)行zip文件壓縮與解壓縮相關(guān)操作技巧,需要的朋友可以參考下2018-09-09Python開(kāi)發(fā)之快速搭建自動(dòng)回復(fù)微信公眾號(hào)功能
這篇文章主要介紹了Python開(kāi)發(fā)之快速搭建自動(dòng)回復(fù)微信公眾號(hào)功能的相關(guān)資料,需要的朋友可以參考下2016-04-04Pytorch中關(guān)于F.normalize計(jì)算理解
這篇文章主要介紹了Pytorch中關(guān)于F.normalize計(jì)算理解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Python爬蟲(chóng)教程知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于Python爬蟲(chóng)教程知識(shí)點(diǎn)總結(jié),有興趣的朋友們可以學(xué)習(xí)參考下。2020-10-10