還是老套路,我們需要先讀取一組數據作為測試文件。
測試文件使用讀書(shū)筆記7的材料,傳送門(mén)如下:
文件讀取功能(Pandas讀書(shū)筆記7)
分享篩選功能之前,我們先分享如何提取某一列,某一行
一、提取DataFrame數據的某一行
1、顯示前N行
使用head函數
2、顯示后N行
3、顯示任意某一行
這里需要說(shuō)明pandas數據是從0開(kāi)始編號的,而我們原始數據是從1開(kāi)始編號的。
所以使用ix函數的時(shí)候,我們輸入的是ix[2],選擇的是原始數據的第三行
4、顯示任意中間行
特殊說(shuō)明1:選取任意行除了ix函數,loc和iloc均可
特殊說(shuō)明2:這里不像列表那里有左閉右開(kāi)的限制。這里兩個(gè)數字都是閉合的,案例中[7:11]則選取的是第8行至第12行(pandas從0開(kāi)始編號)
二、提取任意列
1、按照列名提取單列

2、按照列名提取多列

三、提取任意行列數據
1、提取5至9行、列名字為名稱(chēng)的數據

2、提取5至9行、列名字為名稱(chēng)的數據(方法二)

3、提取5至9行、列名字為名稱(chēng)、最高的數據

四、單條件篩選
篩選其實(shí)就是將某列符合特殊條件的篩選出來(lái),那我們先設立一個(gè)小目標!將漲跌額為正數的篩選出來(lái)!
如何判斷?無(wú)外乎為大于小于等于判斷咯!

df['漲跌額']是選出漲跌額這一列
我們看到使用判斷后返回的是一個(gè)布爾型的數據,是一個(gè)TRUE和FALSE的集合體。
那我們如何將這個(gè)布爾型的數據實(shí)現篩選的功能呢?

我們將這個(gè)布爾型數據作為一個(gè)參數,外面套上原始數據和中括號即可!就實(shí)現了篩選功能。
原理就是布爾型數據為真的話(huà),羅列出來(lái)!
五、篩選失敗的解決方案
成功的道路總是相同的,不成功的道路各有各的不同,本環(huán)節其實(shí)才是本篇文章的精華之一,另一個(gè)精華就是模糊篩選~~
我們已經(jīng)實(shí)現了根據漲跌額來(lái)實(shí)現篩選,那根據漲跌幅為正數進(jìn)行篩選可以嗎?
我們先試驗一下!

錯誤提示字面理解就是大于號不能存在在文本和整型之間。
轉義一下就是你的原始數據不能是字符串!
常見(jiàn)錯誤:原始數字使用文本形式存儲
所以在這里和大家介紹一下如何強制文本轉數字

上述兩種方法均可!
細心的朋友肯定會(huì )說(shuō):“你框我!不是轉化漲跌幅咩!怎么搞成漲跌額了!”

發(fā)現傳統的文本轉數字不管用哇!為蝦米呢?這個(gè)文本轉數字只適用于數字以文本形式存儲的數據,不適用于本身只能用文本形式存儲的數據。(略拗口,可以自己想想~)
由于原始數據帶了一個(gè)%。所以帶%的文本轉數字是比較麻煩的~麻煩程度與Excel處理該類(lèi)問(wèn)題相同。
那如何解決呢?

df['漲跌幅'] = df['漲跌幅'].str.strip('%').astype(float)/100;
我們使用str.strip('%')函數將原始數據的百分號剔除,然后使用astype(float)將原始數據強制轉化為浮點(diǎn)型數據,除以100,讓原始數據保持不變;最后使用賦值將更改后的數據重新賦值給漲跌幅那一列。

然后就可以毫無(wú)壓力的實(shí)現目標了!只不過(guò)將最初的百分比形式展示的改為了小數。
六、多條件篩選
1、且關(guān)系篩選
我們想要得到漲跌幅大于0,且成交量大于1000的數據。
首先漲跌幅大于0怎么表示呢?
df['漲跌幅']>0

成交量大于1000怎么表示呢?
df['成交量']>1000

錯誤總是那么相似,做個(gè)文本轉數字吧
pd.to_numeric(df['成交量'])>1000

發(fā)現還不行,原來(lái)還有這個(gè)符號“-”,無(wú)法強制轉化為數字!

事實(shí)證明,工作中的編程其實(shí)是處于發(fā)現問(wèn)題,解決問(wèn)題的過(guò)程~
那我們多增加一步,先把-替換掉
pd.to_numeric(df['成交量'].str.strip('-'))>1000

費了九年二虎之力,終于分別實(shí)現了不同列的判斷條件。
如何把兩列混合在一起呢?如何以且關(guān)系進(jìn)行組合判斷呢?

df[(df['漲跌幅'] >0)&(pd.to_numeric(df['成交量'].str.strip('-'))>1000)]
我們看一下代碼的邏輯,單條件的代碼邏輯如下:
變量[變量[列]符合什么條件]
簡(jiǎn)化就是 變量的中括號內接一個(gè)條件
那多條件如何表達呢?
變量[(條件1)&(條件2)&(條件N)]
多條件且關(guān)系篩選其實(shí)就是將不同條件用括號括起來(lái)后使用&字符連接~
2、或關(guān)系篩選
前面有了且關(guān)系的鋪墊,或關(guān)系其實(shí)就是把&變更為 |即可!
df[(df['漲跌幅'] >0)|(pd.to_numeric(df['成交量'].str.strip('-'))>1000)]
變量[(條件1)|(條件2)|(條件N)]

七、模糊篩選
模糊篩選想當年也浪費了我不少時(shí)間,我以為pandas會(huì )自帶一個(gè)函數來(lái)的,結果是使用字符串的形式來(lái)實(shí)現的~
提問(wèn):我們將名稱(chēng)那一列含有“金”字的行提取出來(lái)~
Excel實(shí)現這個(gè)功能很簡(jiǎn)單,因為可以通過(guò)我最喜歡的通配符實(shí)現~
pandas只能使用字符串函數find函數,該函數用法與Excel相同~

解釋一下這段代碼
df[df['名稱(chēng)'].str.find('金', start=0, end=None)>=0]
最外層的df[ ]表示呈現整個(gè)表
df['名稱(chēng)'].str.find('金', start=0, end=None)>=0
將名稱(chēng)那一列使用字符串的find函數,如果find的返回值大于0,證明就是含有金字的,如果沒(méi)有金字,返回值是-1,所以通過(guò)該方法可以判斷哪行數據含有金字。

嗯嗯,很有才~~~
聯(lián)系客服