亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

Pandas 數據結構 Series

1. 前言

通過上幾小節的學習,我們已經能夠將外部數據用 Pandas 庫進行解析,通過實際代碼操作可以看出,不同的數據文件解析的函數不同,不同的數據內容,解析出來數據結構也不一樣。了解一組數據的結構類型,對于我們分析數據有著至關重要的作用,那 Pandas 中的數據結構究竟有哪幾種呢?

Pandas 中有兩種主要的數據結構 Series 和 DataFrame,正是這兩種數據結構,是 Pandas 為應用提供一種可靠性、易于使用的基礎。本節課我們將先從 Series 數據結構進行入手,講解 Series 數據結構的特點,以及掌握該數據結構常用的屬性和方法。

2. Series 數據結構概述

Series 是一種一維數組的對象,由一組數據和對應的數據標簽(索引)所組成,也就是 index(索引) 和 values (值),表現形式為索引在左邊,值在右邊,并且其中的索引值是可以重復的,如果不指定索引,默認會創建一個從 0 開始的整數序列索引,數組里面可以放任意類型的數據,但數據必須是一維的;

圖片描述

3. Series 數據結構常用的屬性

3.1 Series 常用的屬性

Series 作為一維數組結構,它的對象中提供了一些常用的屬性,來獲取對象的信息,下面我們列舉了一些常用的屬性。

常用屬性 屬性描述
index 獲取 Series 的索引對象
name 獲取 Series 索引列的名字(index.name)或獲取數據列的名字(values.name
axes 獲取 Series 索引的數組表示形式
values 獲取 Series 的數組表示形式
ndim 獲取 Series 的數據維度(Series是1維數組)
size 獲取數據的個數
dtype 獲取 Series 的數據類型

現在我們通過代碼程序,具體演示上面的屬性操作。

**實例:**我們通過定義一個 Series,然后分別演示上面的屬性操作。

# 引入pandas
import pandas as pd
# 定義一個series對象
obj=pd.Series([12,"welcom",23, "to",34, "pandas",45])
print(obj)

# --- 輸出結果 --- 
0        12
1    welcom
2        23
3        to
4        34
5    pandas
6        45

具體的屬性操作:

# index 屬性
print(obj.index)
#--- 輸出結果 ---
RangeIndex(start=0, stop=7, step=1)   #索引對象的的開始下標,最后下標,步長

# values 屬性
print(obj.values)
#--- 輸出結果 ---
[12 'welcom' 23 'to' 34 'pandas' 45]   #Series的數組表示的值

# name 屬性
print(obj.index.name)
#--- 輸出結果 ---
None  #None是索引列和數據類默認的名稱,可以通過 obj.index.name="索引" 重新命名

# axes 屬性
print(obj.axes)
#--- 輸出結果 ---
[RangeIndex(start=0, stop=7, step=1)]  #下標從0到7,步長為1,長度為8的數組

# ndim 屬性
print(obj.ndim)
#--- 輸出結果 ---
1  #驗證了Series是一維數組

# size 屬性
print(obj.size)
#--- 輸出結果 ---
7  #有7個數據

# dtype 屬性
print(obj.dtype)
#--- 輸出結果 ---
object  #是一個object的數據類型,這里要區分一下數據類型和數據結構,我們說Series是Pandas的數據結構之一,并不是數據類型就是Series。

3.2 Series 常用的方法

另外 Series 中還提供了豐富的函數,方便我們來進行操作,下面我們列舉了幾個常用的操作方法。

常用函數 函數描述
Series() 創建一個 Series 數據結構的對象
isnull()和notnull() 用于檢測缺失數據
argmin()和argmax() 返回對應條件值的索引位置
copy() 復制一個 Series,注意淺拷貝和深拷貝
reindex([x,y,…]) 重返回一個適應新索引的新對象,缺失索引對應數值使用默認值 NaN
drop() 丟棄指定索引的項

下面我們分別看一下每個方法的具體操作實例:

Series() 方法

該方法用于創建一個一維數組的對象,通過該方法有多種方式去創建 Series 對象:方式一:Series([x,y,…])、方式二:Series([x,y,…], index=[param1,param1,…])、方式三:Series({“a”:x,“b”:y,…})

# 引入pandas
import pandas as pd

# 形式一:Series([x,y,...])
obj=pd.Series([12,23,34,45])
print(obj)
#--- 輸出結果 ---
0    12
1    23
2    34
3    45
dtype: int64

# 形式二:Series([x,y,...], index=[param1,param1,...])
obj=pd.Series([12,23,34,45],index=["a","b","c","d"])
print(obj)
#--- 輸出結果 ---    
# 該形式,我們可以指定它的索引列的值
a    12
b    23
c    34
d    45
dtype: int64

# 形式三:Series({"a":x,"b":y,...})
obj2=pd.Series({"a":12,"b":33,"c":5,"d":22})
print(obj2)
#--- 輸出結果 ---
# 這里我們里面傳入的是一個字典,他的key就會對應成索引列,value對應數據列
a    12
b    33
c     5
d    22
dtype: int64

isnull() 和 notnull() 方法

isnull() 是缺失值返回 Ture 運行結果,而 notnull() 則不是缺失值的返回 Ture 運行結果

# 引入pandas
import pandas as pd
obj=pd.Series([12,23,34,45],index=["a","b","c","d"])
print(obj.isnull())
#--- 輸出結果 ---
a    False
b    False
c    False
d    False
dtype: bool
    
print(obj.notnull())
#--- 輸出結果 ---
a    True
b    True
c    True
d    True
dtype: bool

argmin() 和 argmax() 方法

argmin() 用于返回最小值索引的位置,argmax() 用于返回最大值索引的位置

# 引入pandas
import pandas as pd
obj2=pd.Series({"a":12,"b":33,"c":5,"d":22})
print(obj2.argmin())
# --- 輸出結果 ---
2 #最小值的索引為2,因為索引是從0開始的,我們最小值為5,

print(obj2.argmax())
# --- 輸出結果 ---
1 #最小值的索引為1,最大值是33,

copy( ) 方法

該方法為拷貝一個 Series,但要注意里面的 deep 設置,也就是深拷貝 copy(deep=True) 和淺拷貝copy(deep=False) 的問題。淺拷貝:拷貝父對象,不會拷貝對象的內部的子對象,只復制對象本身,沒有復制該對象所引用的對象;深拷貝:完全拷貝了父對象及其子對象,新的組合對象與原對象沒有任何關聯。

# 引入pandas
import pandas as pd
obj2=pd.Series({"a":12,"b":33,"c":5,"d":22})
# 1.cpys 淺拷貝
cpys = obj2.copy(deep=False)
cpys['a']=0
print(cpys)
print(obj2)
# --- 輸出結果 ---
# 這是淺拷貝之后的cpys
a     0
b    33
c     5
d    22
dtype: int64
# 這是被拷貝的 obj2
a     0
b    33
c     5
d    22
dtype: int64
# 通過上面的輸出結果,我們可以看到,我們對拷貝后的對象進行修改,也會影響到被淺拷貝的對象,進而證明了,淺拷貝只復制對象本身,沒有復制該對象所引用的對象
  
# 2.cpys_deep深拷貝
cpys_deep = obj2.copy(deep=True)
cpys_deep['a']=0
print(cpys_deep)
print(obj2)
# --- 輸出結果 ---
# 這是深拷貝之后的cpys_deep
a     0
b    33
c     5
d    22
dtype: int64
# 這是被拷貝的 obj2
a    12
b    33
c     5
d    22
dtype: int64  
# 我們通過輸出結果,可以看到 索引a,obj和cps_deep的值是不一樣的,我們修改拷貝后的對象,并不能影響到被拷貝的對象,這就是深拷貝,它完全拷貝了父對象及其子對象,和之前的對象是相互獨立的。

reindex([x,y,…]) 方法

該方法會將源 Series 對象,按照新的索引順序生成新的 Series 對象,默認如果沒有對應索引的則使用默認值NaN。( NaN 即"?數字" (not a number),在 Pandas 中,它?于表示缺失或NA值 )

# 引入pandas
import pandas as pd
obj=pd.Series([12,23,6,145,44],index=["a","b","c","d","e"])
rs_obj=obj.reindex(["e","d","c","b","a","f","g"])
print(rs_obj)

#--- 輸出結果 ---
e     44.0
d    145.0
c      6.0
b     23.0
a     12.0
f      NaN
g      NaN
dtype: float64
# 這里我們看到按照我們寫的索引的順序,生成了一個新的對象rs_obj,沒有值的默認為NaN進行填充。

drop( ) 方法

該方法通過傳入指定的索引,丟棄對應的數據項,返回一個新的 Series 對象。

# 引入pandas
import pandas as pd
obj=pd.Series([12,23,6,145,44],index=["a","b","c","d","e"])
drop_obj=obj.drop(["e","d"])
print(obj)
print(drop_obj)

#--- 輸出結果 ---
# 源對象
a     12
b     23
c      6
d    145
e     44
dtype: int64
# drop操作后新的對象 drop_obj
a    12
b    23
c     6
dtype: int64

4. 小結

通過本小節內容的學習,我們了解到 Pandas 庫主要包含了兩種數據結構,該節內容主要講述了 Series 數據結構特點,以及我們如何操作該數據結構的常用方法,在實際運用當中,大家會接觸到更多關于 Series 數據結構的使用方法和技巧。本節課程的重點如下:

  • Series 數據結構的常用屬性;
  • Series 數據結構的常用操作方法;

圖片描述

Tips:想要學習更多Pandas相關知識,可以點擊
Pandas Pandas讀取數據文件
Pandas 讀取MySql數據
Pandas 數據結構DataFrame