思維導圖
1 什麼是Series結構?
Series 結構,也稱 Series 序列,是 Pandas 常用的資料結構之一,它是一種類似於一維陣列的結構,由一組資料值(value)和一組標籤組成,其中標籤與資料值之間是一一對應的關係。
Series 可以儲存任何資料型別,比如整數、字串、浮點數、Python 物件等,它的標籤預設為整數,從 0 開始依次遞增。Series 的結構圖,如下所示:
通過標籤我們可以更加直觀地檢視資料所在的索引位置。
2 Series 物件
2.1 建立Series物件
Pandas 使用 Series() 函式來建立 Series 物件,通過這個物件可以呼叫相應的方法和屬性,從而達到處理資料的目的:
import pandas as pd
s=pd.Series( data, index, dtype, copy)
引數說明如下所示:
我們也可以使用陣列、字典、標量值或者 Python 物件來建立 Series 物件。下面展示了建立 Series 物件的不同方法:
2.1.1 建立一個空Series物件
使用以下方法可以建立一個空的 Series 物件,如下所示:
import pandas as pd
#輸出資料為空
s = pd.Series()
print(s)
輸出結果如下:
Series([], dtype: float64)
2.1.2 ndarray建立Series物件
ndarray 是 NumPy 中的陣列型別,當 data 是 ndarry 時,傳遞的索引必須具有與陣列相同的長度。假如沒有給 index 引數傳參,在預設情況下,索引值將使用是 range(n) 生成,其中 n 代表陣列長度,如下所示:
[0,1,2,3…. range(len(array))-1]
使用預設索引,建立 Series 序列物件:
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
s = pd.Series(data)
print (s)
輸出結果如下:
0 a
1 b
2 c
3 d
dtype: object
上述示例中沒有傳遞任何索引,所以索引預設從 0 開始分配 ,其索引範圍為 0 到 len(data)-1
,即 0 到 3。這種設定方式被稱為“隱式索引”。
除了上述方法外,你也可以使用“顯式索引”的方法定義索引標籤,示例如下:
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
#自定義索引標籤(即顯示索引)
s = pd.Series(data,index=[100,101,102,103])
print(s)
輸出結果:
100 a
101 b
102 c
103 d
dtype: object
2.1.3 dict建立Series物件
您可以把 dict 作為輸入資料。如果沒有傳入索引時會按照字典的鍵來構造索引;反之,當傳遞了索引時需要將索引標籤與字典中的值一一對應。
下面兩組示例分別對上述兩種情況做了演示。
示例1,沒有傳遞索引時:
import pandas as pd
import numpy as np
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s = pd.Series(data)
print(s)
輸出結果:
a 0.0
b 1.0
c 2.0
dtype: float64
示例 2,為index
引數傳遞索引時:
import pandas as pd
import numpy as np
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s = pd.Series(data,index=['b','c','d','a'])
print(s)
輸出結果:
b 1.0
c 2.0
d NaN
a 0.0
dtype: float64
當傳遞的索引值無法找到與其對應的值時,使用 NaN(非數字)填充。
2.1.4 標量建立Series物件
如果 data 是標量值,則必須提供索引,示例如下:
import pandas as pd
import numpy as np
s = pd.Series(5, index=[0, 1, 2, 3])
print(s)
輸出如下:
0 5
1 5
2 5
3 5
dtype: int64
標量值按照 index 的數量進行重複,並與其一一對應。
3 訪問Series資料
3.1 位置索引訪問
這種訪問方式與 ndarray 和 list 相同,使用元素自身的下標進行訪問。我們知道陣列的索引計數從 0 開始,這表示第一個元素儲存在第 0 個索引位置上,以此類推,就可以獲得 Series 序列中的每個元素。下面看一組簡單的示例:
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(s[0]) #位置下標
print(s['a']) #標籤下標
輸出結果:
1
1
通過切片的方式訪問 Series 序列中的資料,示例如下:
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(s[:3])
輸出結果:
a 1
b 2
c 3
dtype: int64
如果想要獲取最後三個元素,也可以使用下面的方式:
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(s[-3:])
輸出結果:
c 3
d 4
e 5
dtype: int64
3.2 索引標籤訪問
import pandas as pd
s = pd.Series([6,7,8,9,10],index = ['a','b','c','d','e'])
print(s['a'])
輸出結果:
6
示例 2,使用索引標籤訪問多個元素值
import pandas as pd
s = pd.Series([6,7,8,9,10],index = ['a','b','c','d','e'])
print(s[['a','c','d']])
輸出結果:
a 6
c 8
d 9
dtype: int64
示例3,如果使用了 index 中不包含的標籤,則會觸發異常:
import pandas as pd
s = pd.Series([6,7,8,9,10],index = ['a','b','c','d','e'])
#不包含f值
print(s['f'])
輸出結果:
......
KeyError: 'f'
4 Series常用屬性
下面我們介紹 Series 的常用屬性和方法。在下表列出了 Series 物件的常用屬性。
現在建立一個 Series 物件,並演示如何使用上述表格中的屬性。如下所示:
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(5))
print(s)
輸出結果:
0 0.898097
1 0.730210
2 2.307401
3 -1.723065
4 0.346728
dtype: float64
上述示例的行索引標籤是 [0,1,2,3,4]。
4.1 axes
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(5))
print ("The axes are:")
print(s.axes)
輸出結果
The axes are:
[RangeIndex(start=0, stop=5, step=1)]
4.2 dtype
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(5))
print ("The dtype is:")
print(s.dtype)
輸出結果:
The dtype is:
float64
4.3 empty
返回一個布林值,用於判斷資料物件是否為空。示例如下:
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(5))
print("是否為空物件?")
print (s.empty)
輸出結果:
是否為空物件?
False
4.4 ndim
檢視序列的維數。根據定義,Series 是一維資料結構,因此它始終返回 1。
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(5))
print (s)
print (s.ndim)
輸出結果:
0 0.311485
1 1.748860
2 -0.022721
3 -0.129223
4 -0.489824
dtype: float64
1
4.5 size
返回 Series 物件的大小(長度)。
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(3))
print (s)
#series的長度大小
print(s.size)
輸出結果:
0 -1.866261
1 -0.636726
2 0.586037
dtype: float64
3
4.6 values
以陣列的形式返回 Series 物件中的資料。
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(6))
print(s)
print("輸出series中資料")
print(s.values)
輸出結果:
0 -0.502100
1 0.696194
2 -0.982063
3 0.416430
4 -1.384514
5 0.444303
dtype: float64
輸出series中資料
[-0.50210028 0.69619407 -0.98206327 0.41642976 -1.38451433 0.44430257]
4.7 index
該屬性用來檢視 Series 中索引的取值範圍。示例如下:
#顯示索引
import pandas as pd
s=pd.Series([1,2,5,8],index=['a','b','c','d'])
print(s.index)
#隱式索引
s1=pd.Series([1,2,5,8])
print(s1.index)
輸出結果:
隱式索引:
Index(['a', 'b', 'c', 'd'], dtype='object')
顯示索引:
RangeIndex(start=0, stop=4, step=1)
5 Series常用方法
5.1 head()&tail()檢視資料
如果想要檢視 Series 的某一部分資料,可以使用 head() 或者 tail() 方法。其中 head() 返回前 n 行資料,預設顯示前 5 行資料。示例如下:
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(5))
print ("The original series is:")
print (s)
#返回前三行資料
print (s.head(3))
輸出結果:
原系列輸出結果:
0 1.249679
1 0.636487
2 -0.987621
3 0.999613
4 1.607751
head(3)輸出:
dtype: float64
0 1.249679
1 0.636487
2 -0.987621
dtype: float64
tail() 返回的是後 n 行資料,預設為後 5 行。示例如下:
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(4))
#原series
print(s)
#輸出後兩行資料
print (s.tail(2))
輸出結果:
原Series輸出:
0 0.053340
1 2.165836
2 -0.719175
3 -0.035178
輸出後兩行資料:
dtype: float64
2 -0.719175
3 -0.035178
dtype: float64
5.2 isnull()&nonull()檢測缺失值
isnull() 和 nonull() 用於檢測 Series 中的缺失值。所謂缺失值,顧名思義就是值不存在、丟失、缺少。
- isnull():如果為值不存在或者缺失,則返回 True。
- notnull():如果值不存在或者缺失,則返回 False。
其實不難理解,在實際的資料分析任物中,資料的收集往往要經歷一個繁瑣的過程。在這個過程中難免會因為一些不可抗力,或者人為因素導致資料丟失的現象。這時,我們可以使用相應的方法對缺失值進行處理,比如均值插值、資料補齊等方法。上述兩個方法就是幫助我們檢測是否存在缺失值。示例如下:
import pandas as pd
#None代表缺失資料
s=pd.Series([1,2,5,None])
print(pd.isnull(s)) #是空值返回True
print(pd.notnull(s)) #空值返回False
輸出結果:
0 False
1 False
2 False
3 True
dtype: bool
notnull():
0 True
1 True
2 True
3 False
dtype: bool