Pandas Series結(jié)構(gòu)

2023-02-13 09:15 更新

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)圖,如下所示:

pandas series

通過標(biāo)簽我們可以更加直觀地查看數(shù)據(jù)所在的索引位置。

創(chuàng)建Series對(duì)象

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ì)象的不同方法:

1) 創(chuàng)建一個(gè)空Series對(duì)象

使用以下方法可以創(chuàng)建一個(gè)空的 Series 對(duì)象,如下所示:

import pandas as pd
#輸出數(shù)據(jù)為空
s = pd.Series()
print(s)

輸出結(jié)果如下:

Series([], dtype: float64)

2) ndarray創(chuàng)建Series對(duì)象

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

3) dict創(chuàng)建Series對(duì)象

您可以把 dict 作為輸入數(shù)據(jù)。如果沒有傳入索引時(shí)會(huì)按照字典的鍵來構(gòu)造索引;反之,當(dāng)傳遞了索引時(shí)需要將索引標(biāo)簽與字典中的值一一對(duì)應(yīng)。

下面兩組示例分別對(duì)上述兩種情況做了演示。

示例1,沒有傳遞索引時(shí):

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

示例 2,為index參數(shù)傳遞索引時(shí):

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ù)字)填充。

4) 標(biāo)量創(chuàng)建Series對(duì)象

如果 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)。

訪問Series數(shù)據(jù)

上述講解了創(chuàng)建 Series 對(duì)象的多種方式,那么我們應(yīng)該如何訪問 Series 序列中元素呢?分為兩種方式,一種是位置索引訪問;另一種是索引標(biāo)簽訪問。

1) 位置索引訪問

這種訪問方式與 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

2) 索引標(biāo)簽訪問

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 的常用屬性和方法。在下表列出了 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]。

1) axes

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)]

2) dtype

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

3) empty

返回一個(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

4) ndim

查看序列的維數(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

5) size

返回 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

6) values

以數(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]

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)

輸出結(jié)果:

顯式索引:
Index(['a', 'b', 'c', 'd'], dtype='object')
隱示索引:
RangeIndex(start=0, stop=4, step=1)

Series常用方法

1) head()&tail()查看數(shù)據(jù)

如果想要查看 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

2) isnull()&notnull()檢測缺失值

isnull() 和 notnull() 用于檢測 Series 中的缺失值。所謂缺失值,顧名思義就是值不存在、丟失、缺少。

  • isnull():如果為值不存在或者缺失,則返回 True。
  • notnull():如果值不存在或者缺失,則返回 False。

其實(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


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)