給妹子講python-S02E11Series數據選取方法
python,不管你懂沒懂,反正妹子是搞懂了
轉載請註明:知乎專欄《給妹子講python》--醬油哥
【要點搶先看】
1.類比字典,按照鍵-值的方法來進行取值2.類比數組,採用分片、條件掩碼和花哨索引來取值3.採用索引器使得數值型索引的取值更清晰
前兩集,我們介紹了Pandas的三種基本數據對象,從這一集開始,我們結合這幾種數據對象,按照專題,一步一步的綜合推進。
首先介紹Pandas中數據的獲取,今天先介紹Series對象數據獲取的方式。
之前的劇集中我們談到過,Series和NumPy數組、Python字典在許多方面都有可比之處,那麼我們就從這兩個維度來類比Series數據對象的索引和獲取。
從字典的角度來理解,可以用類似鍵-值的角度來獲取數據:
因為Series本質上可以看做是index序列到值序列的一一映射,因此index本質上可以看做是數據對象的一組鍵,那麼之前字典里的一些常用用法,就可以用在Series對象里了:
import pandas as pddata = pd.Series([0.25,0.5,0.75,1.0] ,index=[a,b,c,d])print(data[c]) #通過鍵來獲取字典的值print(a in data) #判斷鍵是否存在print(data.keys()) #獲取鍵的列表print(list(data.items())) #獲取鍵值對的列表0.75TrueIndex([a, b, c, d], dtype=object)[(a, 0.25), (b, 0.5), (c, 0.75), (d, 1.0)]
是不是感覺非常的熟悉?運用和字典類型進行類比的方法,就非常好接受了。
再補充一點,Series對象還可以利用字典語法進行數據調整,字典里可以通過新增鍵來擴展字典的數據項,Series同樣可以利用新增索引來擴展Series的數據項:
import pandas as pddata = pd.Series([0.25,0.5,0.75,1.0] ,index=[a,b,c,d])data[e] = 1.25print(data)a 0.25b 0.50c 0.75d 1.00e 1.25dtype: float64
Series還可以看做是一維數組對象,那麼我們再次類比一下NumPy數據類型,類比採用NumPy中的分片索引、掩碼以及花哨索引方法。
我們先看看分片索引,Series中的分片索引有兩種形式:顯式和隱式。
import pandas as pddata = pd.Series([0.25,0.5,0.75,1.0] ,index=[a,b,c,d])print(data[a:c])print(data[0:2])a 0.25b 0.50c 0.75dtype: float64a 0.25b 0.50dtype: float64
第一種[a:c],利用實際的索引值進行的分片,是顯式索引值分片,他所得到的結果是包括最後一個值的,而第二種[0:2]則是利用整數索引進行分片,是隱式索引分片,這就如同普通數組分片操作一樣。
最後再來看看其他幾種特殊一點的取值方式:
掩碼索引。例如我們取出Series對象中介於0.2到0.6之間的數據:
import pandas as pddata = pd.Series([0.25,0.5,0.75,1.0] ,index=[a,b,c,d])print(data[(data > 0.2) & (data < 0.6)])a 0.25b 0.50dtype: float64
還有一種所謂的花哨索引,這裡我們也提一下:
import pandas as pddata = pd.Series([0.25,0.5,0.75,1.0] ,index=[a,b,c,d])print(data[[a,d]])a 0.25d 1.00dtype: float64
我們選出了a和d行。
【妹子說】關於Series的索引我有一個疑惑,索引既可以是顯式索引又可以是隱式的數值索引,取值和分片對應兩種不同的索引方式,操作是不一樣的。那如果索引是顯式的索引,但是又是指定的數值序列,那會不會產生歧義?
這個問題問的很好,我們舉例來看,對於這種情況是不是會亂,我們以下面這個Series對象為例
import pandas as pddata = pd.Series([a,b,c,d] ,index=[1,3,5,7])print(data)1 a3 b5 c7 ddtype: object
先看單一索引取值
import pandas as pddata = pd.Series([a,b,c,d] ,index=[1,3,5,7])print(data[1])a
我們發現,單一取值索引操作時,對應的是顯式的索引值
再看看分片操作
import pandas as pddata = pd.Series([a,b,c,d] ,index=[1,3,5,7])print(data[1:3])3 b5 cdtype: object
我們發現,分片操作對應的卻又是隱式的索引
這麼看來,當索引里是整數數值的時候,確實容易混淆,稍有疏忽就會出現一些混亂,那該如何避免呢?
Series提供了索引器來避免不同分片用法所帶來的混亂
第一種索引是loc索引,明確指定是利用顯式索引進行取值和分片操作:
import pandas as pddata = pd.Series([a,b,c,d] ,index=[1,3,5,7])print(data.loc[3])print(data.loc[1:5])b1 a3 b5 c
第二種索引是iloc索引,顯然他表明取值和分片都是採取隱式數值索引的形式:
import pandas as pddata = pd.Series([a,b,c,d] ,index=[1,3,5,7])print(data.iloc[2])print(data.iloc[1:3])c3 b5 cdtype: object
從這裡我們就可以看出索引器的優越性,他使得代碼在處理整數索引的時候消除了可能出現的歧義,讓我們在讀代碼和寫代碼的時候更清晰。明明白白的才是最好的。
【妹子說】通過今天這一集的梳理,Series數據對象的數值獲取方法就很清晰了,那麼下一集再介紹一下DataFrame數據對象的獲取方法吧!
推薦閱讀:
※20171225《甲骨文字詁林補編》索引數位化完成
※20180321《嶽麓書院藏秦簡(壹-參)文字編》索引數位化完成
※如何理解Mysql的索引及他們的原理?
※寫會MySQL索引