序列是一維數組,隻有一個維度(或稱作軸)是行(row),在訪問序列時,隻需要設置一個索引。序列(Series)是由一組相同類型的數據,以及一組與之相關的行标簽(索引)組成,序列要求存儲的數據類型是相同的。
在創建序列時,如果沒有設置索引,那麼pandas自動為序列創建了一個從0開始到N-1的序号,稱作行的索引。也可以顯式設置index參數,為每行設置标簽,pandas把标簽稱作索引。用戶可以通過索引、也可以通過位置來訪問Series對象中的元素。
序列可以看作是索引到數據值的一個映射,一個索引對應一個數據值,這種結構就是有序的字典。
一,創建序列序列的構造函數定義是:
pandas.Series(data=None, index=None, dtype=None, name=None, 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 的索引。
2,顯式傳遞index參數
在構造函數中傳遞自定義的索引列表,索引的長度必須和data的長度相同,如下所示:
>>> sd=pd.Series(data,index=[101,102])
101 a
102 b
dtype: object
3,顯式設置序列的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的數據,而序列隻需要一個索引就可以訪問元素值。
4,從字典構造序列
通過字典來創建Series,字典的key作為序列的索引标簽,value作為對應Key的數據值:
>>> sdata = {'b': 12, 'a': 13}
>>> spd.Series(sdata)
b 12
a 13
dtype: int64
通過字典構建的序列,索引是标簽(字符類型)。
二,序列的屬性序列對象包含的屬性:
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:基于整數位置的索引,用于按位置選擇序列元素
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’}
fill_value:填充的值,默認值是nan
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!