最后一次更新日期: 2019/3/21
pandas
是基于numpy
的數據分析庫,提供一些更易用的數據模型和大量高效的統計方法。
使用前先導入模塊:
import pandas as pd
按需導入以下模塊:
import numpy as np
import matplotlib.pyplot as plt
1. 索引Index
numpy中只有位置索引,而pandas還增加了標簽索引,依賴于一個專用的Index
類型。
常規索引
In [64]: pd.Index([1,2,3])
Out[64]: Int64Index([1, 2, 3], dtype='int64')
In [65]: pd.Index([1.,2.,3.])
Out[65]: Float64Index([1.0, 2.0, 3.0], dtype='float64')
In [66]: pd.Index(['a','b','c'])
Out[66]: Index(['a', 'b', 'c'], dtype='object')
In [67]: pd.Index(range(10))
Out[67]: RangeIndex(start=0, stop=10, step=1)
In [68]: pd.Index(range(10)).values
Out[68]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int64)
In [80]: import datetime as dt
...: dt1=dt.datetime.now()
...: dt2=dt1+dt.timedelta(days=1)
In [81]: pd.Index([dt1,dt2])
Out[81]: DatetimeIndex(['2019-03-09 20:56:14.644159', '2019-03-10 20:56:14.644159'], dtype='datetime64[ns]', freq=None)
Index
在創建時會根據傳入數據(一維序列)自動生成具體的索引類型,也可通過dtype
參數指定類型,但無法正常轉換時會報錯;copy
參數指定創建索引時是否復制源數據,默認false
。
具體的索引類型也可通過各自的方法創建。
Index.values
可以查看作為數據基礎的一維數組,Index.dtype
可以查看數據類型。
多級索引
pandas提供了多級索引以便于分組數據,可用于構造高維數據集,groupby
計算也會自動產生多級索引。
In [5]: midx=pd.MultiIndex(levels=[['a','b'],['c','d']],labels=[[1,1,0,0],[0,1,0,1]],name=['idx1','idx2'])
In [6]: midx
Out[6]:
MultiIndex(levels=[['a', 'b'], ['c', 'd']],
labels=[[1, 1, 0, 0], [0, 1, 0, 1]],
names=['idx1', 'idx2'])
In [9]: midx.set_labels([1,0,1,0],level=1)
Out[9]:
MultiIndex(levels=[['a', 'b'], ['c', 'd']],
labels=[[1, 1, 0, 0], [1, 0, 1, 0]],
names=['idx1', 'idx2'])
In [11]: midx.swaplevel(0,1)
Out[11]:
MultiIndex(levels=[['c', 'd'], ['a', 'b']],
labels=[[0, 1, 0, 1], [1, 1, 0, 0]],
names=['idx2', 'idx1'])
In [12]: pd.MultiIndex.from_arrays([['a','a','b','b'],['c','d','c','d']],names=['idx1','idx2'])
Out[12]:
MultiIndex(levels=[['a', 'b'], ['c', 'd']],
labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
names=['idx1', 'idx2'])
MultiIndex
的第一個參數levels
是每個級別的唯一標簽列表,是一個兩層嵌套的序列,外層對應級別,內層對應唯一標簽;
第二個參數labels
是所有記錄在每個級別上選取的標簽序號,也是一個兩層嵌套的序列,外層對應級別,內層對應記錄,新版本中已被codes
參數取代;
第四個參數names
是每個級別的名稱。
MultiIndex
提供了一些輔助方法,set_levels
、set_labels
、set_names
可以設置整體或是某一級別的索引屬性,通過level
參數指定級別,默認設置整體;
swaplevel
可以交換級別,droplevel
可以刪除級別,sortlevel
可以對指定級別排序;
from_array
、from_tuples
、from_product
、from_frame
方法可從其他結構的數據中創建索引。
2. 數據序列Series
In [99]: s=pd.Series([1,2,3,4],name='s1')
In [100]: s
Out[100]:
0 1
1 2
2 3
3 4
Name: s1, dtype: int64
In [101]: pd.Series([[1,2],[3,4]],index=['row1','row2'])
Out[101]:
row1 [1, 2]
row2 [3, 4]
dtype: object
In [102]: s.dtype
Out[102]: dtype('int64')
In [103]: s.name
Out[103]: 's1'
In [104]: s.values
Out[104]: array([1, 2, 3, 4], dtype=int64)
In [105]: s.index
Out[105]: RangeIndex(start=0, stop=4, step=1)
In [106]: s.shape
Out[106]: (4,)
核心數據模型其一,由序列名name
、標簽索引index
、值數組(一維)values
組成。用于存放一維數據,只有一個軸方向:0,shape
屬性可以查看數據集的形狀。
創建時只能接收一維序列數據(list,tuple,ndarray),超過一維的將后面的維度看作元素的維度,會根據傳入的數據自動判斷類型,也可通過dtype
參數顯示指定。
默認情況下會生成范圍索引,可通過index
參數指定一個一維序列作為索引,也可在創建后直接為index
屬性賦值。
3. 數據框DataFrame
In [107]: df=pd.DataFrame([[1,'a'],[2,'b']],columns=['col1','col2'])
In [108]: df
Out[108]:
col1 col2
0 1 a
1 2 b
In [113]: df.dtypes
Out[113]:
col1 int64
col2 object
dtype: object
In [114]: df.index
Out[114]: Int64Index([1, 2], dtype='int64', name='col1')
In [116]: df.columns
Out[116]: Index(['col1', 'col2'], dtype='object')
In [117]: df.values
Out[117]:
array([[1, 'a'],
[2, 'b']], dtype=object)
In [125]: df.col2
Out[125]:
col1
1 a
2 b
Name: col2, dtype: object
In [126]: pd.DataFrame({'col1':[1,3],'col2':['a','b']})
Out[126]:
col1 col2
0 1 a
1 3 b
In [127]: df.shape
Out[127]: (2, 2)
核心數據模型其二,也就是數據表,由列標簽索引columns
、行標簽索引index
、值數組(二維)values
組成。用于存放二維數據,有兩個軸方向:0和1,對應行坐標和列坐標,shape
屬性可以查看數據集的形狀。列數據的訪問可以通過與列名相同的屬性名訪問,僅在定義了字符串列名時可用,一個單列即是一個Series
。
創建時只能接收二維序列數據(list,tuple,ndarray),超過二維的將后面的維度看作元素的維度,會根據傳入的數據自動判斷類型,也可通過dtype
參數顯示指定,與numpy不太一樣的是,DataFrame
的列可以定義不同的數據類型,通過創建時的自動判斷,或是篩選出列后轉換類型,DataFrame.dtypes
屬性可查看所有列的數據類型。相比numpy,pandas的DataFrame
創建還增加了對dict
數據源的支持,key
對應列名,value
對應列數據。
默認情況下會生成范圍索引,可通過index
參數指定一個一維序列作為索引,也可在創建后直接為index
屬性賦值,DataFrame.set_index
方法可以返回替換了索引的數據框副本而不影響原數據。
DataFrame
相當于Series
的堆疊,沿DataFrame
的行或列方向進行寬度為1的切片,得到的就是一個Series
。
原本pandas還提供了三維的數據模型Panel
,但新版中已經廢棄,可嘗試使用多級索引MultiIndex
來構造更高維度的數據集。
4. 分類數據Categorical
pandas提供了分類數據類型用于約束此類數據,該類型會限制分類標簽的取值,并可為分類標簽提供排序依據。
In[14]: pd.Categorical(['a','b','b','c'],categories=['a','b'],ordered=True)
Out[14]:
[a, b, b, NaN]
Categories (2, object): [a < b]
In[15]: pd.Categorical(['a','b','b','c'])
Out[15]:
[a, b, b, c]
Categories (3, object): [a, b, c]
第一個參數values
為所有分類標簽的序列;
第二個參數categories
為唯一分類標簽的序列,當指定該參數后,values
中不屬于categories
的標簽會被替換為NaN
,不指定時會根據values
自動生成;
第三個參數ordered
聲明唯一分類標簽是否指示排序方式,為True
時會按categories
中的順序對標簽標定大小關系,默認False
。