標籤:

Python-pandas模塊Series(1)

1.前言

series

n. 系列,連續;[電] 串聯;級數;叢書

在介紹series之前,需要說一說它和pandas之間的關係。其實很好理解,pandas模塊中有兩個主要的數據結構:

  1. Series一種類似一維數組的數據結構;
  2. DataFrame一個表格型的數據結構。(後面會介紹他)

雖然它們並不能解決所有的問題,但是他們為大多數的應用提供了一種可靠的、易於使用的基礎。

2.Series

Series是一種類似於一維數組的對象,它由一組數據(他的類型可以是任意的numpy數據類型)還有一組與之相關的數據標籤(即索引)組成。

我們從上面的描述,知道了series中有兩個關鍵的東西,一個就是數據也就是value,一個就是與我們的value相對應的索引index,擁有索引也是series的特點所在。那接下來看看如何去創建series:

第一種方式:只給series傳入value值

import pandas as pdimport numpy as np#創建一個ndarray數組array = np.arange(4)#參數為列表series = pd.Series([1,2,3,4])#參數為元組series2 = pd.Series((1,2,3,4))#參數為seriesseries3 = pd.Series(series)#參數為numpy數組series4 = pd.Series(array)print(series)print(series2)print(series3)print(series4)

result

注意:

  1. 我們的series參數可以是列表、元組、numpy數組、series對象或其他的序列類型;
  2. 我們知道series中包括了value和index,但是我們並沒有指定index,而是直接傳入了value值。從結果上可以看出會自動加上index,當然這個時候的index是從(0 - N-1)[N就是value的長度];
  3. 如果你更改了列表中的某個值改為浮點數,你會發現輸出series的結果就變成了浮點類型。numpy數組最重要的特性就是numpy數組是同構數據多維容器,也就是說其中所有的元素必須是相同numpy數據類型的,所以可以推斷是否series中的value類型就是numpy數組類型呢?其實series的value類型就是numpy數組類型,
    1. 對於類似元組這樣的序列化對象,直接就是value值,也就是會把這樣的序列化對象轉換成numpy數組;
    2. 對於像series或者字典等這種有index的序列化對象,會把他們中的值轉換成numpy數組。
  4. series的字元串的表現形式為:索引在左邊,值在右邊。這也是series的特殊之處。

第二種方式:指定value值的同時指定索引index(我們不希望使用默認的索引0-N-1,我們想要自己指定index的值)

import pandas as pd# series = pd.Series([1,2,3,4,5],index = [a,b,c,d])# series = pd.Series([1,2,3,4],index = [a,b,c,d,e])series = pd.Series([1,2,3,4],index = [a,b,c,d])print(series)

result

注意:

  1. value的長度和index的長度一定要相匹配,要不然會拋出異常;
  2. 我們指定index的類型是字元串,輸出series輸出dtype是series中的value的數據類型。

第三種方式:把數據存放在Python中的字典中,然後通過這個字典來創建series。我們知道series有一個value和與之對應的索引index,很像Python中的字典,所以series提供了通過字典來創建series對象的方法。

import pandas as pdsdata = {計算機1班:30,計算機2班:40}series = pd.Series(sdata)print(series)

result

注意:

  1. 可以把series看成是一個定長的有序字典,因為它是索引值到數據值的一個映射,它可以用在許多原本需要在字典參數的函數中。

import pandas as pdsdata = {計算機1班:30,計算機2班:40}series = pd.Series(sdata)print(計算機1班 in series)#Trueprint(series)

介紹完了三種方式創建series之後,還有一點需要注意的,我們知道,Series的參數可以是另外一個序列化對象,那加入我傳入的對象是另外一個擁有自定義index的Series。那麼我在新創建的Series中在指定index會怎麼樣呢?

import pandas as pd#通過第三種方式創建一個seriessdata = {計算機1班:30,計算機2班:40}series = pd.Series(sdata)#新創建指定新的indexseries = pd.Series(series,index = [計算機1班,通信1班,通信2班])print(series)

result

注意:

  1. 可以看出如果Series中的序列化參數是由index的對象(比如字典或者series對象),在創建新的series的時候,在傳入一個index參數的話,就需要注意了。如果傳入的是一些沒有index的序列對象,那麼這個時候更需要注意value參數的長度要與index的長度相一致才行,要不然會拋出異常。

出現了NaN(即"非數字"(not a number)),在pandas中,他用於表示預設或者Na值。使用缺失(missing)或NA表示缺失的數據。pandas提供了兩個函數用來檢測缺式的數據。

import pandas as pd#通過第三種方式創建一個seriessdata = {計算機1班:30,計算機2班:40}series = pd.Series(sdata)#新創建指定新的indexseries = pd.Series(series,index = [計算機1班,通信1班,通信2班])print(series)print(pd.notnull(series))print(pd.isnull(series))

result

當然series中也有類似的實例方法:

series.isnull()series.notnull()

3.series的增刪改查

我們前面說到可以把series看成是一個定長的有序字典,它可以用在許多原本需要在字典參數的函數中。對於Python字典來說,我們知道他的增刪改查的操作,那麼對於series來說,我們可以從類似字典的增刪改查這四個方面說一說對series的操作。

增:

import pandas as pdsdata = {計算機1班:30,計算機2班:40}series = pd.Series(sdata)#如果原index中有新創建的index,則對應與series相當於通過index修改value值series[計算機1班] = 300#如果原index中沒有新創建的index,則對應與series相當於添加series[通信1班] = 50print(series)

result

刪:

我們先說說對於Python字典中的刪除的操作。

  1. 第一種方式-del(如果沒有key就會報錯),例:del dit[key];
  2. 第二種方式-pop()[不存在就報錯]。注意:這個pop(key)的參數是必須要給的;
  3. 第三種方式-popitem()隨機刪除

其實對於series來說,也是可以使用這些操作來對series進行操作的。

import pandas as pdsdata = {計算機1班:30,計算機2班:40}series = pd.Series(sdata)del series[計算機1班]# del series[通信1班]errorprint(series)

result

注意:

  1. 其實和Python字典一樣,如果del後的key值沒有的話,就會拋出異常。

import pandas as pdsdata = {計算機1班:30,計算機2班:40}series = pd.Series(sdata)# series.pop()#errorseries.pop(計算機1班)# series.pop(通信1班)#errorprint(series)

result

注意:

  1. pop必須有參數,否則會拋出異常;
  2. pop後的參數必須是在原series中有的index值,否則會拋出異常。

import pandas as pdsdata = {計算機1班:30,計算機2班:40}series = pd.Series(sdata)series.popitem()print(series)

AttributeError: Series object has no attribute popitem

注意:

  1. 也就是說series並不能使用Python字典的popitem進行隨機的刪除。

改:

1.我們可以通過再次賦值給index來更改series的index的值。

import pandas as pdsdata = {計算機1班:30,計算機2班:40}series = pd.Series(sdata)print(series)print(----------)series.index = [通信1班,通信2班]#但是不能給values這樣重新賦值print(series)

result

注意:

  1. 新創建的想要更改的index的值,一定要和原series的index的長度相一致,要不然會拋出異常。

2.我們可以根據index來找到與之對應的value值,然後去進行修改。

import pandas as pdsdata = {計算機1班:30,計算機2班:40}series = pd.Series(sdata)#如果原index中有新創建的index,則對應與series相當於通過index修改value值series[計算機1班] = 300#如果原index中沒有新創建的index,則對應與series相當於添加series[通信1班] = 50print(series)

result

查:

對於series來說,他就是由兩個部分組成的,value和index,那對應的查也就是對這兩個地方進行查。

1.我們可以查看value和index的全部數據元素。

import pandas as pdsdata = {計算機1班:30,計算機2班:40}series = pd.Series(sdata)print(series.values)print(type(series.values))print(series.index)print(type(series.index))

結果

2.類似字典,可以通過索引index來查看value值。

import pandas as pdsdata = {計算機1班:30,計算機2班:40}series = pd.Series(sdata)print(series[計算機1班])#30

3.類似字典,可以通過in關鍵字查看series中是否有index值(默認)或者是value值

import pandas as pdsdata = {計算機1班:30,計算機2班:40}series = pd.Series(sdata)print(計算機1班 in series)#Ture(默認)print(計算機1班 in series.index)#Tureprint(30 in series.values)#True

4.series的其他操作

numpy數組運算(如根據布爾型數組進行過濾、標量乘法、應用數學函數等)都會保留索引和值之間的鏈接:

import pandas as pdimport numpy as npsdata = {a:1,b:2,c:3,d:4}series = pd.Series(sdata)print(series[series > 0])print(series * 2 )print(np.exp(series))

result

series一個最重要的功能是:它在算術運算中會自動對齊不同的索引的數據。

import pandas as pdsdata = {a:1,b:2,c:3,d:4}sdata2 = {a:10,b:20,e:100}series = pd.Series(sdata)series2 = pd.Series(sdata2)print(series)print(series2)print(series + series2)

result

series對象本身及索引都有一個name屬性,該屬性跟pandas其他的關鍵功能關係非常密切。

import pandas as pdsdata = {a:1,b:2,c:3,d:4}series = pd.Series(sdata)series.name = numberseries.index.name = charprint(series)

result


推薦閱讀:

Matplotlib中調整坐標軸的比例
numpy和pandas入門
python下numpy不成功,請問有沒有簡單的安裝方法?
Numpy基本語法示例②
ImagePy開發文檔 —— 常用匯總

TAG:numpy | Python |