一維的 Series


Pandas 基於 NumPy,以 SeriesDataFramePanel 資料結構來表現一維、二維、三維等資料,可以用更具體的 indexcolumnitems 名稱來存取資料,而不只是面對索引數字。

Series 可用來表現一維資料,可看成是 NumPy 一維陣列的封裝,在最簡單的情境下,建構 Series 就像是建構 NumPy 一維陣列。例如:

import pandas as pd

nums1 = pd.Series([1, 2, 3])
nums2 = nums1 + 10

print(nums1)
print(nums2)

看來就像是 NumPy,只不過是 np.array 換成了 pd.Series?這是因為 Pandas 與 NumPy 有很好的相容性,許多 NumPy 的使用經驗都可以過渡到 Pandas 使用,例如這邊示範了〈Univerial 函式〉,以上會顯示的結果如下:

0    1
1    2
2    3
dtype: int64
0    11
1    12
2    13
dtype: int64

可以看到,Series 具有索引,〈NumPy 陣列索引〉中對一維 NumPy 陣列的索引方式,基本上都可以在 Series 上使用;然而不同的是,Series 可以指定其他的值作為索引,例如:

import pandas as pd

date = pd.Series([1975, 5, 26], index = ['年', '月', '日'])
print(date)
print(date['月'])         # 以指定名稱作為索引
print(date[['年', '日']]) # 也可以用名稱作為索引陣列

執行結果如下:

年    1975
月       5
日      26
dtype: int64
5
年    1975
日      26
dtype: int64

可以指定其他值作為索引,乍看很像是鍵值成對的 dict 物件,你也可以使用 dict 來建立 Series 實例:

import pandas as pd

date = pd.Series({
    '年' : 1975,
    '月' : 5,
    '日' : 26
})

print(date)
print(date['月'])
print(date[['年', '日']])

不過,Series 可以允許重複的索引名稱:

import pandas as pd

data1 = pd.Series({'a': 10, 'b': 20, 'c': 30, 'a': 40})
data2 = pd.Series([10, 20, 30, 40], index = ['a', 'b', 'c', 'a'])

print(data1)
print(data2)

這會顯示以下的結果:

a    40
b    20
c    30
dtype: int64
a    10
b    20
c    30
a    40
dtype: int64

因此,如果你的索引名稱會重複的話,就別使用 dict 來建構 Series,因為你在組織 dict 時,鍵就不允許重複了;另外,自行指定 index 時,索引名稱數量必須與元素數量相同。

想要取出元素值時,可以透過 Seriesvalues,這會取得 NumPy 陣列,想要取得索引名稱時,可以透過 index,這會取得 pandas.core.indexes.base.Index 的子類別實例,其上擁有許多可用的方法,也就是說,想針對索引名稱作運算,也是十分方便。