序列(Series
)是由一組數據(各種NumPy數據類型),以及一組與之相關的數據標簽(索引)組成,序列不要求數據類型是相同的。
序列是一個一維數組,只有一個維度(或稱作軸)是行(row),在訪問序列時,只需要設置一個索引。pandas自動為序列創建了一個從0開始到N-1的序號,稱作行的下標,行的位置。可以顯式設置index參數,為每行設置標簽,pandas把標簽稱作索引。用戶可以通過索引、也可以通過位置來訪問Series對象中的元素。
序列可以看作是索引到數據值的一個映射,一個索引對應一個數據值,這種結構就是有序的字典。
一,創建序列
序列的構造函數定義是:
pandas.Series(data=None, index=None, dtype=None, name=None, copy=False)
構造函數的參數:
- data:傳遞給序列的數據,可以是ndarray、list或字典
- index:設置軸的索引,索引值的個數與data參數的長度相同。如果沒有設置index參數,那么默認值是 np.arange(n),或者 RangeIndex (0, 1, 2, …, n)。
- dtype:設置序列元素的數據類型,如果沒有設置,那么將推斷數據類型
- name:序列是一個多行的結構,name是序列的名稱
- copy:復制數據,默認值是false
索引的下標是自動生成的,從0開始,加1遞增。對於序列的data,可以通過序列的屬性values來訪問;對於序列的索引,可以通過序列的屬性index來訪問。
1,使用ndarray或list創建序列
使用ndarray的一維數組,或者list來構造序列,序列包含兩部分:索引和序列值,如下所示
>>> data=np.array(['a','b']) # data=['a','b'] >>> sd=pd.Series(data) 0 a 1 b dtype: object
分析序列的輸出:
最左側的0和1是行索引,a和b是數據值。
在構造序列時,如果沒有傳遞index參數,默認情況下,pandas分配了從 0 到 len(data)-1 的索引。
顯式傳遞index參數
在構造函數中傳遞自定義的索引列表,索引的長度必須和data的長度相同,如下所示:
>>> sd=pd.Series(data,index=[101,102]) 101 a 102 b dtype: object
顯式設置序列的name和index的name
序列是一維數組,只有一個維度,那就是row,在序列中為Index命名就是設置行軸的名稱。
>>> sd=pd.Series(data=['a','b'],index=pd.Index([101,102],name='idx_name'),name='series_name') idx_name 101 a 102 b Name: series_name, dtype: object
序列看起來像多行一列的數據集,但是他們之間有本質的區別,多行一列是二維數組,有行名稱和列名稱,需要使用兩個索引值來訪問單個cell的數據,而序列只需要一個索引就可以訪問元素值。
3,從字典構造序列
通過字典來創建Series,字典的key作為序列的索引標簽,value作為對應Key的數據值:
>>> sdata = {'b': 12, 'a': 13} >>> spd.Series(sdata) b 12 a 13 dtype: int64
通過字典構建的序列,索引是標簽(字符類型)。
二,序列的屬性
序列對象包含的屬性:
- index:序列的索引
- shape:序列的形狀,表示各個維度的數量
- array:把序列的數據值轉換為Pandas數組
- values:把序列的數據值轉換為numpy數組
- dtype:序列元素的數據類型
- hasnan:序列是否包含nan
- is_unique:序列的元素是否是唯一的
1,序列的索引
>>> sd.index Int64Index([101, 102], dtype='int64', name='idx_name')
2,序列的shape
>>> sd.shape
(2,)
3,序列的PandasArray或ndarray數組
>>> sd.array <PandasArray> ['a', 'b'] Length: 2, dtype: object >>> sd.values array(['a', 'b'], dtype=object)
三,序列數據的轉換
轉換序列數據值的類型:
Series.astype(self, dtype, copy=True, errors='raise', **kwargs)
把序列轉換為NumPy數組:
Series.to_numpy(self, dtype=None, copy=False)
把序列轉換為list:
Series.to_list(self)
四,訪問序列的元素
序列元素的訪問,可以通過索引和行標簽,索引標簽是在構造函數中通過index參數傳遞或構造的,而索引值(也可以稱作序列的下標)是默認生成的,第一個元素的下標值是0,依次加1遞增。
1,通過索引來訪問序列
對於序列,通過索引來訪問序列元素的格式是:Sereis[index],索引可以是整數,也可以是字符類型的標簽:
>>> sd[102] 'b'
通過屬性來訪問序列的元素值
2,at和iat屬性,用於訪問序列的單個元素值
at屬性通過索引訪問單個序列值
>>> sd.at[102] 'b'
iat屬性表示通過位置訪問序列的單個元素值:
>>> sd.iat[0] 'a'
3,loc和iloc,通過序列的位置來訪問元素
iloc:基於整數位置的索引,用於按位置選擇序列元素
- 單個位置索引,比如sd.iloc[1]
- 位置索引的列表,比如 sd.iloc[[0,1]]
- 整數序列,比如,sd.iloc[0:2]
- 布爾值數組,sd.iloc[[True, False, True, False]]
loc:通過索引標簽和布爾值數組來選擇序列的元素
舉個例子,通過整數位置來選擇序列的元素:
>>> sd.iloc[0:2] idx_name 101 a 102 b Name: series_name, dtype: object
舉個例子,通過索引的標簽來選擇序列的元素:
>>> sd.loc[[101,102]] idx_name 101 a 102 b Name: series_name, dtype: object
4,通過位置掩碼(布爾索引數組)來訪問序列的元素
在上面的例子中,[101,102] 稱作索引數組,如果索引數據的元素類型是布爾類型,並且索引數組的元素數量和序列相同,那么把這種索引數組稱作位置掩碼。當位置為True時,表示選擇該元素;當位置為False,表示不選擇該元素。
>>> sd.loc[[True,False]] idx_name 101 a Name: series_name, dtype: object
5,獲得懶惰迭代器
可以通過序列的__iter__()函數獲得值的迭代器,也可以通過items()或iteritems()函數獲得包含索引和值的元組的迭代器:
Series.__iter__(self) #Return an iterator of the values. Series.items(self) #Lazily iterate over (index, value) tuples. Series.iteritems(self) #Lazily iterate over (index, value) tuples.
例如,通過items()函數獲得序列的迭代器,並通過for循環來打印序列的值
>>> for t in sd.items(): ... print(t) ... ('b', 12) ('a', 13) ('d', 14) ('c', 10)
五,序列的條件索引
按照條件選擇序列的特定行,可以使用序列的loc或iloc屬性,並使用布爾索引來篩選序列的數據行:
>>> sd.loc[sd>12] a 13 d 14 dtype: int64
也可以使用邏輯表達式對條件進行組合計算:
>>> sd.loc[(sd>12) & (sd<14)] a 13 dtype: int64 >>> sd.loc[(sd>12) | (sd<14)] b 12 a 13 d 14 c 10 dtype: int64
注意,必須用小括號把兩個邏輯表達式括起來,不然會報錯:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
查看序列的邏輯表達式的值:
>>> (sd>12) & (sd<14)
b False
a True
d False
c False
dtype: bool
六,序列的基本操作
1,刪除元素的元素
根據行標簽刪除制定的元素
Series.drop(self, labels=None)
2,對序列元素執行條件查詢
如果序列元素的值滿足cond條件,返回other的值;如果不滿足,返回元素的值。
Series.where(self, cond, other=nan, inplace=False)
3,把序列追加到一個序列末尾
把to_append序列追加到序列的末尾,設置ignore_index表示忽略原始序列的索引,重新創建一個索引:
Series.append(self, to_append, ignore_index=False, verify_integrity=False)
4,重索引
重索引是指按照新的索引對序列的元素進行重新排列,如果某個索引值不存在,就形成一個空洞,默認情況下,在空洞處插入缺失值:
Series.reindex(self, index=None, **kwargs)
參數 **kwargs 表示數據不固定的參數,其中有:
method:表示插補缺失值的方法,有效值有{None, ‘backfill’/’bfill’, ‘pad’/’ffill’, ‘nearest’}
- None 表示插入缺失值nan
- ‘backfill’/’bfill’:表示使用空洞之后的最近的有效值來填充
- ‘pad’/’ffill’:表示使用空洞之前的最近的有效值來填充
- ‘nearest’:表示使用最靠近空洞的有效值來填充
fill_value:填充的值,默認值是nan
參考文檔: