Pandas 數(shù)據(jù)結(jié)構(gòu) Series
1. 前言
通過上幾小節(jié)的學(xué)習(xí),我們已經(jīng)能夠?qū)⑼獠繑?shù)據(jù)用 Pandas 庫進(jìn)行解析,通過實(shí)際代碼操作可以看出,不同的數(shù)據(jù)文件解析的函數(shù)不同,不同的數(shù)據(jù)內(nèi)容,解析出來數(shù)據(jù)結(jié)構(gòu)也不一樣。了解一組數(shù)據(jù)的結(jié)構(gòu)類型,對(duì)于我們分析數(shù)據(jù)有著至關(guān)重要的作用,那 Pandas 中的數(shù)據(jù)結(jié)構(gòu)究竟有哪幾種呢?
Pandas 中有兩種主要的數(shù)據(jù)結(jié)構(gòu) Series 和 DataFrame,正是這兩種數(shù)據(jù)結(jié)構(gòu),是 Pandas 為應(yīng)用提供一種可靠性、易于使用的基礎(chǔ)。本節(jié)課我們將先從 Series 數(shù)據(jù)結(jié)構(gòu)進(jìn)行入手,講解 Series 數(shù)據(jù)結(jié)構(gòu)的特點(diǎn),以及掌握該數(shù)據(jù)結(jié)構(gòu)常用的屬性和方法。
2. Series 數(shù)據(jù)結(jié)構(gòu)概述
Series 是一種一維數(shù)組的對(duì)象,由一組數(shù)據(jù)和對(duì)應(yīng)的數(shù)據(jù)標(biāo)簽(索引)所組成,也就是 index(索引) 和 values (值),表現(xiàn)形式為索引在左邊,值在右邊,并且其中的索引值是可以重復(fù)的,如果不指定索引,默認(rèn)會(huì)創(chuàng)建一個(gè)從 0 開始的整數(shù)序列索引,數(shù)組里面可以放任意類型的數(shù)據(jù),但數(shù)據(jù)必須是一維的;
3. Series 數(shù)據(jù)結(jié)構(gòu)常用的屬性
3.1 Series 常用的屬性
Series 作為一維數(shù)組結(jié)構(gòu),它的對(duì)象中提供了一些常用的屬性,來獲取對(duì)象的信息,下面我們列舉了一些常用的屬性。
常用屬性 | 屬性描述 |
---|---|
index | 獲取 Series 的索引對(duì)象 |
name | 獲取 Series 索引列的名字(index.name)或獲取數(shù)據(jù)列的名字(values.name) |
axes | 獲取 Series 索引的數(shù)組表示形式 |
values | 獲取 Series 的數(shù)組表示形式 |
ndim | 獲取 Series 的數(shù)據(jù)維度(Series是1維數(shù)組) |
size | 獲取數(shù)據(jù)的個(gè)數(shù) |
dtype | 獲取 Series 的數(shù)據(jù)類型 |
現(xiàn)在我們通過代碼程序,具體演示上面的屬性操作。
**實(shí)例:**我們通過定義一個(gè) Series,然后分別演示上面的屬性操作。
# 引入pandas
import pandas as pd
# 定義一個(gè)series對(duì)象
obj=pd.Series([12,"welcom",23, "to",34, "pandas",45])
print(obj)
# --- 輸出結(jié)果 ---
0 12
1 welcom
2 23
3 to
4 34
5 pandas
6 45
具體的屬性操作:
# index 屬性
print(obj.index)
#--- 輸出結(jié)果 ---
RangeIndex(start=0, stop=7, step=1) #索引對(duì)象的的開始下標(biāo),最后下標(biāo),步長
# values 屬性
print(obj.values)
#--- 輸出結(jié)果 ---
[12 'welcom' 23 'to' 34 'pandas' 45] #Series的數(shù)組表示的值
# name 屬性
print(obj.index.name)
#--- 輸出結(jié)果 ---
None #None是索引列和數(shù)據(jù)類默認(rèn)的名稱,可以通過 obj.index.name="索引" 重新命名
# axes 屬性
print(obj.axes)
#--- 輸出結(jié)果 ---
[RangeIndex(start=0, stop=7, step=1)] #下標(biāo)從0到7,步長為1,長度為8的數(shù)組
# ndim 屬性
print(obj.ndim)
#--- 輸出結(jié)果 ---
1 #驗(yàn)證了Series是一維數(shù)組
# size 屬性
print(obj.size)
#--- 輸出結(jié)果 ---
7 #有7個(gè)數(shù)據(jù)
# dtype 屬性
print(obj.dtype)
#--- 輸出結(jié)果 ---
object #是一個(gè)object的數(shù)據(jù)類型,這里要區(qū)分一下數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu),我們說Series是Pandas的數(shù)據(jù)結(jié)構(gòu)之一,并不是數(shù)據(jù)類型就是Series。
3.2 Series 常用的方法
另外 Series 中還提供了豐富的函數(shù),方便我們來進(jìn)行操作,下面我們列舉了幾個(gè)常用的操作方法。
常用函數(shù) | 函數(shù)描述 |
---|---|
Series() | 創(chuàng)建一個(gè) Series 數(shù)據(jù)結(jié)構(gòu)的對(duì)象 |
isnull()和notnull() | 用于檢測(cè)缺失數(shù)據(jù) |
argmin()和argmax() | 返回對(duì)應(yīng)條件值的索引位置 |
copy() | 復(fù)制一個(gè) Series,注意淺拷貝和深拷貝 |
reindex([x,y,…]) | 重返回一個(gè)適應(yīng)新索引的新對(duì)象,缺失索引對(duì)應(yīng)數(shù)值使用默認(rèn)值 NaN |
drop() | 丟棄指定索引的項(xiàng) |
下面我們分別看一下每個(gè)方法的具體操作實(shí)例:
Series() 方法
該方法用于創(chuàng)建一個(gè)一維數(shù)組的對(duì)象,通過該方法有多種方式去創(chuàng)建 Series 對(duì)象:方式一: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)
#--- 輸出結(jié)果 ---
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)
#--- 輸出結(jié)果 ---
# 該形式,我們可以指定它的索引列的值
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)
#--- 輸出結(jié)果 ---
# 這里我們里面?zhèn)魅氲氖且粋€(gè)字典,他的key就會(huì)對(duì)應(yīng)成索引列,value對(duì)應(yīng)數(shù)據(jù)列
a 12
b 33
c 5
d 22
dtype: int64
isnull() 和 notnull() 方法
isnull() 是缺失值返回 Ture 運(yùn)行結(jié)果,而 notnull() 則不是缺失值的返回 Ture 運(yùn)行結(jié)果
# 引入pandas
import pandas as pd
obj=pd.Series([12,23,34,45],index=["a","b","c","d"])
print(obj.isnull())
#--- 輸出結(jié)果 ---
a False
b False
c False
d False
dtype: bool
print(obj.notnull())
#--- 輸出結(jié)果 ---
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())
# --- 輸出結(jié)果 ---
2 #最小值的索引為2,因?yàn)樗饕菑?開始的,我們最小值為5,
print(obj2.argmax())
# --- 輸出結(jié)果 ---
1 #最小值的索引為1,最大值是33,
copy( ) 方法
該方法為拷貝一個(gè) Series,但要注意里面的 deep 設(shè)置,也就是深拷貝 copy(deep=True) 和淺拷貝copy(deep=False) 的問題。淺拷貝:拷貝父對(duì)象,不會(huì)拷貝對(duì)象的內(nèi)部的子對(duì)象,只復(fù)制對(duì)象本身,沒有復(fù)制該對(duì)象所引用的對(duì)象;深拷貝:完全拷貝了父對(duì)象及其子對(duì)象,新的組合對(duì)象與原對(duì)象沒有任何關(guān)聯(lián)。
# 引入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)
# --- 輸出結(jié)果 ---
# 這是淺拷貝之后的cpys
a 0
b 33
c 5
d 22
dtype: int64
# 這是被拷貝的 obj2
a 0
b 33
c 5
d 22
dtype: int64
# 通過上面的輸出結(jié)果,我們可以看到,我們對(duì)拷貝后的對(duì)象進(jìn)行修改,也會(huì)影響到被淺拷貝的對(duì)象,進(jìn)而證明了,淺拷貝只復(fù)制對(duì)象本身,沒有復(fù)制該對(duì)象所引用的對(duì)象
# 2.cpys_deep深拷貝
cpys_deep = obj2.copy(deep=True)
cpys_deep['a']=0
print(cpys_deep)
print(obj2)
# --- 輸出結(jié)果 ---
# 這是深拷貝之后的cpys_deep
a 0
b 33
c 5
d 22
dtype: int64
# 這是被拷貝的 obj2
a 12
b 33
c 5
d 22
dtype: int64
# 我們通過輸出結(jié)果,可以看到 索引a,obj和cps_deep的值是不一樣的,我們修改拷貝后的對(duì)象,并不能影響到被拷貝的對(duì)象,這就是深拷貝,它完全拷貝了父對(duì)象及其子對(duì)象,和之前的對(duì)象是相互獨(dú)立的。
reindex([x,y,…]) 方法
該方法會(huì)將源 Series 對(duì)象,按照新的索引順序生成新的 Series 對(duì)象,默認(rèn)如果沒有對(duì)應(yīng)索引的則使用默認(rèn)值NaN。( NaN 即"?數(shù)字" (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)
#--- 輸出結(jié)果 ---
e 44.0
d 145.0
c 6.0
b 23.0
a 12.0
f NaN
g NaN
dtype: float64
# 這里我們看到按照我們寫的索引的順序,生成了一個(gè)新的對(duì)象rs_obj,沒有值的默認(rèn)為NaN進(jìn)行填充。
drop( ) 方法
該方法通過傳入指定的索引,丟棄對(duì)應(yīng)的數(shù)據(jù)項(xiàng),返回一個(gè)新的 Series 對(duì)象。
# 引入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)
#--- 輸出結(jié)果 ---
# 源對(duì)象
a 12
b 23
c 6
d 145
e 44
dtype: int64
# drop操作后新的對(duì)象 drop_obj
a 12
b 23
c 6
dtype: int64
4. 小結(jié)
通過本小節(jié)內(nèi)容的學(xué)習(xí),我們了解到 Pandas 庫主要包含了兩種數(shù)據(jù)結(jié)構(gòu),該節(jié)內(nèi)容主要講述了 Series 數(shù)據(jù)結(jié)構(gòu)特點(diǎn),以及我們?nèi)绾尾僮髟摂?shù)據(jù)結(jié)構(gòu)的常用方法,在實(shí)際運(yùn)用當(dāng)中,大家會(huì)接觸到更多關(guān)于 Series 數(shù)據(jù)結(jié)構(gòu)的使用方法和技巧。本節(jié)課程的重點(diǎn)如下:
- Series 數(shù)據(jù)結(jié)構(gòu)的常用屬性;
- Series 數(shù)據(jù)結(jié)構(gòu)的常用操作方法;
Tips:想要學(xué)習(xí)更多Pandas相關(guān)知識(shí),可以點(diǎn)擊
Pandas Pandas讀取數(shù)據(jù)文件
Pandas 讀取MySql數(shù)據(jù)
Pandas 數(shù)據(jù)結(jié)構(gòu)DataFrame