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