pandas 學習 第2篇:Series -(創建,屬性,轉換和索引)


序列(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

 

 

參考文檔:

pandas Series


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM