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參數
- ffill或pad:前向填充,即將缺失值的前一個索引的值填充在缺失值位置上
- bfill或backfill:後向(或進位)填充,即將缺失值的後一個索引的值填充在缺失值位置上
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