Series 結(jié)構(gòu),也稱 Series 序列,是 Pandas 常用的數(shù)據(jù)結(jié)構(gòu)之一,它是一種類似于一維數(shù)組的結(jié)構(gòu),由一組數(shù)據(jù)值(value)和一組標(biāo)簽組成,其中標(biāo)簽與數(shù)據(jù)值之間是一一對(duì)應(yīng)的關(guān)系。
Series 可以保存任何數(shù)據(jù)類型,比如整數(shù)、字符串、浮點(diǎn)數(shù)、Python 對(duì)象等,它的標(biāo)簽?zāi)J(rèn)為整數(shù),從 0 開始依次遞增。Series 的結(jié)構(gòu)圖,如下所示:
通過標(biāo)簽我們可以更加直觀地查看數(shù)據(jù)所在的索引位置。
Pandas 使用 Series() 函數(shù)來創(chuàng)建 Series 對(duì)象,通過這個(gè)對(duì)象可以調(diào)用相應(yīng)的方法和屬性,從而達(dá)到處理數(shù)據(jù)的目的:
import pandas as pd
s=pd.Series( data, index, dtype, copy)
參數(shù)說明如下所示:
參數(shù)名稱 | 描述 |
---|---|
data | 輸入的數(shù)據(jù),可以是列表、常量、ndarray 數(shù)組等。 |
index | 索引值必須是惟一的,如果沒有傳遞索引,則默認(rèn)為 np.arrange(n)。 |
dtype | dtype表示數(shù)據(jù)類型,如果沒有提供,則會(huì)自動(dòng)判斷得出。 |
copy | 表示對(duì) data 進(jìn)行拷貝,默認(rèn)為 False。 |
我們也可以使用數(shù)組、字典、標(biāo)量值或者 Python 對(duì)象來創(chuàng)建 Series 對(duì)象。下面展示了創(chuàng)建 Series 對(duì)象的不同方法:
使用以下方法可以創(chuàng)建一個(gè)空的 Series 對(duì)象,如下所示:
import pandas as pd
#輸出數(shù)據(jù)為空
s = pd.Series()
print(s)
輸出結(jié)果如下:
Series([], dtype: float64)
ndarray 是 NumPy 中的數(shù)組類型,當(dāng) data 是 ndarry 時(shí),傳遞的索引必須具有與數(shù)組相同的長度。假如沒有給 index 參數(shù)傳參,在默認(rèn)情況下,索引值將使用是 range(n) 生成,其中 n 代表數(shù)組長度,如下所示:
[0,1,2,3…. range(len(array))-1]
使用默認(rèn)索引,創(chuàng)建 Series 序列對(duì)象:
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
s = pd.Series(data)
print (s)
輸出結(jié)果如下:
0 a
1 b
2 c
3 d
dtype: object
上述示例中沒有傳遞任何索引,所以索引默認(rèn)從 0 開始分配 ,其索引范圍為 0 到len(data)-1,即 0 到 3。這種設(shè)置方式被稱為“隱式索引”。
除了上述方法外,你也可以使用“顯式索引”的方法定義索引標(biāo)簽,示例如下:
import pandas as pd
import numpy as np
data = np.array(['a','b','c','d'])
#自定義索引標(biāo)簽(即顯示索引)
s = pd.Series(data,index=[100,101,102,103])
print(s)
輸出結(jié)果:
100 a
101 b
102 c
103 d
dtype: object
您可以把 dict 作為輸入數(shù)據(jù)。如果沒有傳入索引時(shí)會(huì)按照字典的鍵來構(gòu)造索引;反之,當(dāng)傳遞了索引時(shí)需要將索引標(biāo)簽與字典中的值一一對(duì)應(yīng)。
下面兩組示例分別對(duì)上述兩種情況做了演示。
import pandas as pd
import numpy as np
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s = pd.Series(data)
print(s)
輸出結(jié)果:
a 0.0
b 1.0
c 2.0
dtype: float64
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)
輸出結(jié)果:
b 1.0
c 2.0
d NaN
a 0.0
dtype: float64
當(dāng)傳遞的索引值無法找到與其對(duì)應(yīng)的值時(shí),使用 NaN(非數(shù)字)填充。
如果 data 是標(biāo)量值,則必須提供索引,示例如下:
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
標(biāo)量值按照 index 的數(shù)量進(jìn)行重復(fù),并與其一一對(duì)應(yīng)。
上述講解了創(chuàng)建 Series 對(duì)象的多種方式,那么我們應(yīng)該如何訪問 Series 序列中元素呢?分為兩種方式,一種是位置索引訪問;另一種是索引標(biāo)簽訪問。
這種訪問方式與 ndarray 和 list 相同,使用元素自身的下標(biāo)進(jìn)行訪問。我們知道數(shù)組的索引計(jì)數(shù)從 0 開始,這表示第一個(gè)元素存儲(chǔ)在第 0 個(gè)索引位置上,以此類推,就可以獲得 Series 序列中的每個(gè)元素。下面看一組簡單的示例:
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(s[0]) #位置下標(biāo)
print(s['a']) #標(biāo)簽下標(biāo)
輸出結(jié)果:
1
1
通過切片的方式訪問 Series 序列中的數(shù)據(jù),示例如下:
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(s[:3])
輸出結(jié)果:
a 1
b 2
c 3
dtype: int64
如果想要獲取最后三個(gè)元素,也可以使用下面的方式:
import pandas as pd
s = pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(s[-3:])
輸出結(jié)果:
c 3
d 4
e 5
dtype: int64
Series 類似于固定大小的 dict,把 index 中的索引標(biāo)簽當(dāng)做 key,而把 Series 序列中的元素值當(dāng)做 value,然后通過 index 索引標(biāo)簽來訪問或者修改元素值。
示例1,使用索標(biāo)簽訪問單個(gè)元素值:
import pandas as pd
s = pd.Series([6,7,8,9,10],index = ['a','b','c','d','e'])
print(s['a'])
輸出結(jié)果:
6
示例 2,使用索引標(biāo)簽訪問多個(gè)元素值
import pandas as pd
s = pd.Series([6,7,8,9,10],index = ['a','b','c','d','e'])
print(s[['a','c','d']])
輸出結(jié)果:
a 6
c 8
d 9
dtype: int64
示例3,如果使用了 index 中不包含的標(biāo)簽,則會(huì)觸發(fā)異常:
import pandas as pd
s = pd.Series([6,7,8,9,10],index = ['a','b','c','d','e'])
#不包含f值
print(s['f'])
輸出結(jié)果:
......
KeyError: 'f'
下面我們介紹 Series 的常用屬性和方法。在下表列出了 Series 對(duì)象的常用屬性。
名稱 | 屬性 |
---|---|
axes | 以列表的形式返回所有行索引標(biāo)簽。 |
dtype | 返回對(duì)象的數(shù)據(jù)類型。 |
empty | 返回一個(gè)空的 Series 對(duì)象。 |
ndim | 返回輸入數(shù)據(jù)的維數(shù)。 |
size | 返回輸入數(shù)據(jù)的元素?cái)?shù)量。 |
values | 以 ndarray 的形式返回 Series 對(duì)象。 |
index | 返回一個(gè)RangeIndex對(duì)象,用來描述索引的取值范圍。 |
現(xiàn)在創(chuàng)建一個(gè) Series 對(duì)象,并演示如何使用上述表格中的屬性。如下所示:
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(5))
print(s)
輸出結(jié)果:
0 0.898097
1 0.730210
2 2.307401
3 -1.723065
4 0.346728
dtype: float64
上述示例的行索引標(biāo)簽是 [0,1,2,3,4]。
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(5))
print ("The axes are:")
print(s.axes)
輸出結(jié)果
The axes are:
[RangeIndex(start=0, stop=5, step=1)]
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(5))
print ("The dtype is:")
print(s.dtype)
輸出結(jié)果:
The dtype is:
float64
返回一個(gè)布爾值,用于判斷數(shù)據(jù)對(duì)象是否為空。示例如下:
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(5))
print("是否為空對(duì)象?")
print (s.empty)
輸出結(jié)果:
是否為空對(duì)象?
False
查看序列的維數(shù)。根據(jù)定義,Series 是一維數(shù)據(jù)結(jié)構(gòu),因此它始終返回 1。
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(5))
print (s)
print (s.ndim)
輸出結(jié)果:
0 0.311485
1 1.748860
2 -0.022721
3 -0.129223
4 -0.489824
dtype: float64
1
返回 Series 對(duì)象的大小(長度)。
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(3))
print (s)
#series的長度大小
print(s.size)
輸出結(jié)果:
0 -1.866261
1 -0.636726
2 0.586037
dtype: float64
3
以數(shù)組的形式返回 Series 對(duì)象中的數(shù)據(jù)。
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(6))
print(s)
print("輸出series中數(shù)據(jù)")
print(s.values)
輸出結(jié)果:
0 -0.502100
1 0.696194
2 -0.982063
3 0.416430
4 -1.384514
5 0.444303
dtype: float64
輸出series中數(shù)據(jù)
[-0.50210028 0.69619407 -0.98206327 0.41642976 -1.38451433 0.44430257]
該屬性用來查看 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)
輸出結(jié)果:
顯式索引:
Index(['a', 'b', 'c', 'd'], dtype='object')
隱示索引:
RangeIndex(start=0, stop=4, step=1)
如果想要查看 Series 的某一部分?jǐn)?shù)據(jù),可以使用 head() 或者 tail() 方法。其中 head() 返回前 n 行數(shù)據(jù),默認(rèn)顯示前 5 行數(shù)據(jù)。示例如下:
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(5))
print ("The original series is:")
print (s)
#返回前三行數(shù)據(jù)
print (s.head(3))
輸出結(jié)果:
原系列輸出結(jié)果:
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 行數(shù)據(jù),默認(rèn)為后 5 行。示例如下:
import pandas as pd
import numpy as np
s = pd.Series(np.random.randn(4))
#原series
print(s)
#輸出后兩行數(shù)據(jù)
print (s.tail(2))
輸出結(jié)果:
原Series輸出:
0 0.053340
1 2.165836
2 -0.719175
3 -0.035178
輸出后兩行數(shù)據(jù):
dtype: float64
2 -0.719175
3 -0.035178
dtype: float64
isnull() 和 notnull() 用于檢測 Series 中的缺失值。所謂缺失值,顧名思義就是值不存在、丟失、缺少。
其實(shí)不難理解,在實(shí)際的數(shù)據(jù)分析任物中,數(shù)據(jù)的收集往往要經(jīng)歷一個(gè)繁瑣的過程。在這個(gè)過程中難免會(huì)因?yàn)橐恍┎豢煽沽?,或者人為因素?dǎo)致數(shù)據(jù)丟失的現(xiàn)象。這時(shí),我們可以使用相應(yīng)的方法對(duì)缺失值進(jìn)行處理,比如均值插值、數(shù)據(jù)補(bǔ)齊等方法。上述兩個(gè)方法就是幫助我們檢測是否存在缺失值。示例如下:
import pandas as pd
#None代表缺失數(shù)據(jù)
s=pd.Series([1,2,5,None])
print(pd.isnull(s)) #是空值返回True
print(pd.notnull(s)) #空值返回False
輸出結(jié)果:
0 False
1 False
2 False
3 True
dtype: bool
notnull():
0 True
1 True
2 True
3 False
dtype: bool
更多建議: