給妹子講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索引

TAG:數據分析 | Python | 索引 |