tft每日頭條

 > 生活

 > pandas層次索引

pandas層次索引

生活 更新时间:2024-08-23 11:21:59

序列是一維數組,隻有一個維度(或稱作軸)是行(row),在訪問序列時,隻需要設置一個索引。序列(Series)是由一組相同類型的數據,以及一組與之相關的行标簽(索引)組成,序列要求存儲的數據類型是相同的。

在創建序列時,如果沒有設置索引,那麼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:設置序列元素的數據類型,如果沒有設置,那麼pandas将推斷數據類型
  • 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 的索引。

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

通過字典構建的序列,索引是标簽(字符類型)。

二,序列的屬性

序列對象包含的屬性:

  • 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層次索引(pandas學習第2篇Series-)1

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关生活资讯推荐

热门生活资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved