Python Pandas 的使用——Series

Python Pandas 的使用——Series

Pandas是一個強大的分析結構化數據的工具集;它的使用基礎是Numpy(提供高性能的矩陣運算);用於數據挖掘和數據分析,同時也提供數據清洗功能。

1. Pandas 安裝

官方推薦的安裝方式是通過Anaconda安裝,但Anaconda太過龐大,若只是需要Pandas的功能,則可通過PyPi方式安裝。

pip install Pandas

2. Pandas 的數據結構——Series

使用pandas前需要先引入pandas,若無特別說明,pd作爲Pandas別名的通用寫法
import pandas as pd   

2.1 Series的創建

  • Series定義
    • Series像是一個Python的dict類型,因爲它的索引與元素是映射關係
    • Series也像是一個ndarray類型,因爲它也可以通過series_name[index]方式訪問
    • Series是一維的,但能夠存儲不同類型的數據
    • 每個Series都有一組索引與數據對應,若不指定則默認爲整型索引
  • 不顯式指定index
# Series 默認索引(不顯式指定index,則Series使用默認索引,[0, 1, 2, 3, 4...]
series1 = pd.Series([10, 7, -4, 1])

# 或者通過以下方式創建Series
l = [10, 7, -4, 1]
series1 = pd.Series(l)
out:
    series1
0    10
1     7
2    -4
3     1
dtype: int64
  • 顯式指定index
series2 = pd.Series(['ant', 'bear', 'cat', 'dog'], index=['a', 'b', 'c', 'd'])

# 或者通過以下方式創建Series
l = ['ant', 'bear', 'cat', 'dog']
index = ['a', 'b', 'c', 'd']
series1 = pd.Series(l, index=index)
out:
    series2
a     ant
b    bear
c     cat
d     dog
dtype: object

Pandas 中整型爲int64,浮點型爲float64,字符串、布爾型等其他數據類型爲object

  • 通過dict生成Series
d = {'b': 1, 'a': 0, 'c': 2}
series3 = pd.Series(d)
out:
    series3
b    1
a    0
c    2
dtype: int64

相比於python中的dict,Series中索引與元素是一種映射關係,元素在Series對象中是有序存儲的,並是通過索引實現其有序的。

如果python版本 >= 3.6 並且 Pandas 版本 >= 0.23 , 則通過dict創建的Series索引按照dict的插入順序排序

如果python版本 < 3.6 或者 Pandas 版本 < 0.23,則通過dict創建的Series索引按照按詞彙順序排列

  • 指定dict索引順序創建Series
d = {'b': 1, 'a': 0, 'c': 2, 'd': 3}
names = ['a', 'b', 'c']
series4 = pd.Series(d,index=names)
out:
    series4
a    0
b    1
c    2
dtype: int64

由原先的 [‘b’, ‘a’, ‘c’] 變成了指定的 [‘a’,‘b’,‘c’],對於指定索引names未出現的index ’d’ ,則自動過濾掉了,若names中出現dict中沒有的索引,則該索引對應值爲NaN

d = {'b': 1, 'a': 0, 'c': 2, 'd': 3}
names = ['a', 'b', 'c' ,'e']
series4 = pd.Series(d,index=names)
out:
    series4
a    0.0
b    1.0
c    2.0
e    NaN
dtype: float64
  • 通過ndarray創建
series5 = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])

# 或者通過以下方式創建Series
l = np.random.randn(5)
index = ['a', 'b', 'c', 'd', 'e']
series1 = pd.Series(l, index=index)
out:
    series5
a    1.025255
b   -0.684486
c    1.870848
d   -0.517517
e   -0.087879
dtype: float64
  • 通過標量創建

Pandas 通過標量(scalar)創建Series 有兩種,一種是創建int64,另一種則是float64,區別在於標量類型

series6 = pd.Series(5, index=['a', 'b', 'c'])
series7 = pd.Series(5.0, index=['a', 'b', 'c'])

# 對於創建float64來說,可縮寫標量,eg:
series7 = pd.Series(5., index=['a', 'b', 'c'])
out:
    series6
a    5
b    5
c    5
dtype: int64
    
    series7
a    5.0
b    5.0
c    5.0
dtype: float64

2.2 Series元素的訪問

  • series_name[index] 方式

一如 ndarray 對元素的訪問採 用ndarray_name[index] 的方式,Series 的訪問也可採用 series_name[index] 方式訪問。

這裏的index指的是在不給Series顯式指定index的時候,Series默認的整型索引

print(series2[0])  # out:ant
print(series2[:3]) # out:a      ant;b     bear;c    camel;dtype: objectd
print(series1[series1 > series1.median()])  # out:0    10;1     7;dtype: int64
print(series2[[2, 3, 1]]) # out:c    camel;d      dog;b     bear;dtype: object
  • series_name[key]

一如dict對元素的訪問採用 dict_name[key] 的方式,Series 的訪問也可採用 series_name[key] 方式訪問。

這裏的key指的是在給 Series 顯式指定的index,類似於dict的key

print(series2['a']) # out:ant

2.3 Series內容修改

  • Series元素值的修改
series2['c'] = 'camel'
# 或者 series2['2'] = 'camel'
print(series2['c'])   # out:camel
  • Series元素索引的修改
# 通過series.index 可以獲取到Series的索引,替換該索引即可
print(series2.index)  # Index(['a', 'b', 'c', 'd'], dtype='object')
# series.index 是一個list對象,可通過series.index[index]來訪問指定的索引並替換之

2.4 Series的元素屬性

屬性 說明
values 以數組方式獲取Series的元素值
index 以數組方式獲取Series的元素索引
name 獲取values的name(需額外指定)
index.name 獲取index的name(需額外指定)
dtype 獲取Series數據類型
array 以數組方式獲取Series的值,與values的區別在於array返回的是PandasArray()數據結構

2.5 Series常用函數

  • Series 拷貝

    • 深拷貝
    cpys = series2.copy(deep=True)  # deep參數設置爲True,則實現深拷貝,創建一個新對象,對series進行復制
    
    print(cpys.values is series2.values or cpys.index is series2.index) # False
    
    • 淺拷貝
    cpys = series2.copy(deep=False)  # deep參數設置爲False,則實現淺拷貝,創建一個新對象,但不復制原series的數據,也不復制其索引,僅對索引與數據指向原數據,不同於(cpys = series2)
    
    print(cpys.values is series2.values and cpys.index is series2.index) # True
    

    如果不指定deep參數,則默認deep=True

    • 淺拷貝不同於“=”
    cpys2 = series2   # 該操作不創建對象,只對原對象創建一個新的變量名稱
    

    “=” 與 Series.copy(deep=False)的淺拷貝是不一樣的,”=“ 是直接對整個series貼上一個新標籤,並不創建新的對象。但Series.copy(deep=False)是先創建一個新的對象,之後,對原對象中values與index貼上新的標籤並使新對象的values與index指向之。

    print(cpys2 is series2) # True
    print(cpys is series2) # False
    
  • Series重設索引reindex函數

    reindex() 函數會創建一個新的對象,用以適應新的索引,並不會修改源對象

    • fill_value 參數 : 對缺失值進行填充
    s = pd.Series(['Tom', 'Kim', 'Andy'], index=['No.1', 'No.2', 'No.3'])
    rs = s.reindex(['No.0', 'No.1', 'No.2', 'No.3', 'No.4']) # 缺失索引對應數值默認使用Nan填充
    rs2 = s.reindex(['No.0', 'No.1', 'No.2', 'No.3', 'No.4'], fill_value='填充值')
    # 設置索引對應數值默認使用“填充值”填充
    
    out:
        rs
    No.0     NaN
    No.1     Tom
    No.2     Kim
    No.3    Andy
    No.4     NaN
    dtype: object
    
    	rs2
    No.0     填充值
    No.1     Tom
    No.2     Kim
    No.3    Andy
    No.4     填充值
    dtype: object
    
    • method參數
      • ffillpad:前向填充,即將缺失值的前一個索引的值填充在缺失值位置上
      • bfillbackfill後向(或進位)填充,即將缺失值的後一個索引的值填充在缺失值位置上
    s = pd.Series(['Tom', 'Kim', 'Andy'], index=['No.1', 'No.2', 'No.3'])
    rs = s.reindex(['No.0', 'No.1', 'No.4', 'No.5'], method='ffill')
    rs2 = s.reindex(['No.0', 'No.1', 'No.4', 'No.5'], method='bfill')
    
    out:
        rs
    No.0     NaN    # 由於前一個索引沒有值,則不填充
    No.1     Tom
    No.4    Andy    # 因爲前向填充(取No.3的值Andy作爲填充值)
    No.5    Andy    # 取No.4的值作爲填充值
    dtype: object
        
        rs2
    No.0    Tom
    No.1    Tom    
    No.4    NaN     # 取No.5的值作爲填充值,即NaN
    No.5    NaN     # 由於後一個索引沒有值,則不填充,默認爲NaN
    dtype: object
    
  • Series 刪除元素

    series2.drop('c')
    print(series2)
    
    series2
    a      ant
    b     bear
    c    camel
    d      dog
    dtype: object
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章