咱們在上一篇介紹了 NumPy,本篇介紹 pandas。python
Pandas
是基於Numpy
構建的,讓以NumPy
爲中心的應用變的更加簡單。segmentfault
Series數組
由一組數據(各類 NumPy 數據類型)和一組索引組成:數據結構
Values
和 index
屬性:app
給所建立的Series
帶有一個能夠對各個數據點進行標記的索引:函數
與普通NumPy
數組相比,能夠經過索引的方式選取Series
中的單個或一組值:spa
可將Series
當作是一個定長的有序字典,它是索引值到數據值的一個映射(它能夠用在許多本來須要字典參數的函數中)。.net
若是數據被存放在一個 python 字典中,能夠直接經過這個字典來建立Series
:設計
若是隻傳入一個字典,則結果Series
中的索引就是原字典的鍵(有序排列),上面的states
。3d
Series
最重要的一個功能是在算數運算中自動對齊不一樣索引的數據:
Series
對象自己及其索引都有一個name屬性
:
Series
的索引能夠經過賦值的方式就地修改:
DataFrame
是一個表格型的數據結構。既有行索引
也有列索引
。DataFrame
中面向行和麪向列的操做基本是平衡的。DataFrame
中的數據是以一個或多個二維塊存放的。用層次化索引,將其表示爲更高維度的數據。
構建 DataFrame:直接傳入一個由等長列表或 NumPy 數組組成的字典。
會自動加上索引,但指定列序列,則按指定順序進行排列:
和Series
同樣,若是傳入的列在數據中找不到,就會產生NA
值:
經過賦值的方式進行修改:
經過相似字典標記的方式或屬性的方式,能夠將DataFrame
的列獲取爲一個Series
:
行也能夠經過位置或名稱的方式進行獲取,好比用索引字段ix
。
將列表或數組賦值給某個列時,其長度必須跟DataFrame
的長度相匹配。若是賦值的是一個Series
,就會精確匹配DataFrame
的索引,全部的空位都將被填上缺失值:
給不存在的列賦值會建立出一個新列,關鍵字del
用於刪除列:
經過索引方式返回的列是相應數據的視圖,並非副本,對返回的Series
作的任何修改都會反映到源DataFrame
上,經過series
的copy
方法便可顯式地複製列。
另外一種常見的數據形式是嵌套字典,若是將它傳給DataFrame
,解釋爲——外層字典的鍵做爲列,內層鍵做爲行索引。
對結果進行轉置:
指定索引按序列:
由Series
組成的字典差很少也是同樣的用法:
設置了DataFrame
的index
和columns
的 name 屬性
,這些信息也會被顯示,values 屬性
以二維ndarray
的形式返回DataFrame
中的數據:
若是DataFrame
各列的數據類型不一樣,值數組的數據類型就會選用能兼容全部列的數據類型(如 dtype = object)。
索引對象
pandas
的索引對象,管理軸標籤和其餘元數據(如軸名稱等)。
構建Series
或DataFrame
時,所用到的任何數組或其餘序列的標籤都會被轉換成一個Index
,且Index
對象是不可修改的:
Index
的功能相似一個固定大小的集合:
從新索引
方法 reindex
:建立一個適應新索引的新對象。
調用該Series
的reindex
將會根據新索引進行重排。若是某個索引值當前不存在,就引入缺失值。
對於時間序列這樣的有序數據,從新索引時可能須要作一些差值處理:
對於DataFrame
,reindex
能夠修改行、列索引,或兩個都修改。若是僅傳入一列,則會從新索引行:
使用columns
關鍵字可從新索引列:
同時對行、列進行索引:
ix
標籤索引功能:
丟棄制定軸上的項
drop
方法返回的是一個在指定軸上刪除了指定值的新對象:
對於DataFrame
,能夠刪除任意軸上的索引值:
索引、選取和過濾
Series
索引的工做方式相似於NumPy
數組的索引,但Series
的索引值不僅是整數:
利用標籤的切片運算,其包含閉區間(與普通 python 切片運算不一樣):
對DataFrame
進行索引就是獲取一個列:
或多個列:
這種索引方式的特殊狀況:經過切片或布爾型數組選取行。
另外一種用法是經過布爾型DataFrame
進行索引(在語法上更像 ndarray):
專門的索引字段 ix
,是一種從新索引的簡單手段:
算術運算和數據對齊
pandas
最重要的一個功能是對不一樣索引的對象進行算術運算。
對不一樣的索引對,取並集:
自動的數據對齊操做在不重疊的索引出引入了NA值
,即一方有的索引,另外一方沒有,運算後該處索引的值爲缺失值。
對DataFrame
,對齊操做會同時發生在行和列上。
在算術方法中填充值
對運算後的NA值
處填充一個特殊值(好比 0):
不然 e 列都是NaN值
。
相似,在對Series
和 DataFrame
從新索引時,也能夠指定一個填充值:
用這幾個特定字的,叫算術方法:add/ sub/ div/ mul
,即:加/減/除/乘。
DataFrame 和 Series 之間的運算
計算一個二維數組與其某行之間的差:
這個就叫作廣播,下面的每行都作這個運算了。
默認狀況下,DataFrame
和Series
之間的算術運算會將Series
的索引匹配到DataFrame
的列,而後沿着行一直向下廣播:
獲得
作加法 frame+series2
,找不到的值就並集爲NaN
。
若是你但願匹配行,且在列上廣播,則必須使用算術運算方法:
傳入的軸號就是但願匹配的軸。
函數的應用和映射
NumPy
的ufuncs
可用於操做pandas
對象,以abs
爲例:
DataFrame
的 apply
方法:將函數應用到各列或行所造成的一維數組上:
許多最爲常見的數據統計功能都被封裝爲DataFrame
的方法,無需使用apply
方法。
除標量值外,傳遞給apply
的函數還能夠返回由多個值組成的Series
:
用 applymap
獲得frame
中各個浮點值的格式化字符串:
Series
有一個用於應用元素級函數的 map
方法:
排序和排名
sort_index
方法:返回一個已排序的新對象
對於DataFrame
,能夠根據任意一個軸上的索引進行排序:
指定了axis=1
,是對列進行排序。
默認按升序,降序用ascending=False
:
對Series
進行排序,可用方法sort_values()
:
在排序時,任何缺失值默認都會被放到Series
末尾。
在DataFrame
上,用by
根據列的值進行排序:
根據多個列:
rank
方法:默認狀況下,rank
是經過「爲各組分配一個平均排名」的方式破壞平級關係的。
根據值在原數據中出現的順序給出排名:
按降序進行排名:
DataFrame
能夠在行或列上計算排名:
帶有重複值的軸索引
雖然許多pandas
函數都要求標籤惟一(如 reindex),但這不是強制性的。
帶有重複索引的Series
:
索引的is_unique
屬性能夠判斷它的值是否惟一。
帶有重複索引的DataFrame
:
在Pandas
中,DataFrame.ix[i]
和DataFrame.iloc[i]
均可以選取DataFrame
中第i
行的數據,那麼這兩個命令的區別在哪裏呢?
ix
能夠經過行號和行標籤進行索引,而iloc
只能經過行號索引,即ix
能夠看作是loc
和iloc
的綜合。
pandas
對象擁有一組經常使用的數學和統計方法:用於從Series
中提取單個值,或從DataFrame
的行或列中提取一個Series
。
跟Numpy
數組方法相比,它們都是基於沒有缺失數據的假設而構建的。
傳入 axis=1
將會按行進行求和運算:
NA值
會自動被排除,如 1.40+NaN=1.40
, NaN+NaN=0.00
。
經過skipna
選項能夠禁用該功能:(獲得 1.40+NaN=NaN
, NaN+NaN=NaN
)
返回間接統計(輸出了值所在的行名):
累計型的(樣本值的累計和):
一次性產生多個彙總統計:
對於非數值型數據,describe
會產生另一種彙總統計:
相關係數與協方差
Series
和DataFrame
:
corr
方法: 相關係數cov
方法:協方差DataFrame
的corrwith
方法:計算其列或行跟另外一個Series
或DataFrame
之間的相關係數。傳入一個DataFrame
計算按列名配對的相關係數,傳入axis=1
便可按行進行計算。
惟一值、值計數以及成員資格
從一維Series
的值中抽取信息。
unique
函數:獲得Series
中的惟一值數組
value_counts
:用於計算一個Series
中各值出現的頻率:
Series
按降序排列。value_counts
是一個頂級pandas
方法,可用於任何數組或序列。
isin
:用於判斷矢量化集合的成員資格,可用於選取Series
或DataFrame
列中數據的子集:
pandas
的設計目標之一就是讓缺失數據的處理任務儘可能輕鬆。
pandas
使用浮點值 NaN(Not a Number)
表示浮點和非浮點數組中的缺失數據。它只是一個便於被檢測出來的標記而已。
python 內置的None值
也會被當作NA
處理(如 string_data[0]=None)。
濾掉缺失數據
對於一個Series
, dropna
返回一個僅含非空數據和索引值的Series
:
經過布爾型索引也能夠達到這個目的:
對於DataFrame
對象,dropna
默認丟棄任何含有缺失值的行:
丟棄全爲NA
的那些行,axis=1
則丟棄列:
只想留下一部分參數,用thresh
參數:
thresh=3
:保留至少 3 個非空值的行,即一行中有 3 個值是非空的就保留.
填充缺失數據
fillna
方法:經過一個常數調用fillna
就會將缺失值替換爲那個常數值。
經過一個字典調用fillna
,能夠實現對不一樣的列填充不一樣的值:
fillna
默認會返回新對象(副本),但也能夠對現有對象進行就地修改:
插值方法(對 reindx 有效的也可用於 fillna):
你能夠用fillna
實現許多別的功能,好比傳入Series
的平均值或中位數:
在一個軸上用多個(2 個以上)索引級別,即以低維度形式處理高維度數據。
MultiIndex
索引的 Series
的格式化輸出形式:
選取數據子集:
在「內層」中進行選取:
層次化索引在數據重塑和基於分組的操做中很重要。好比說,上面的數據能夠經過其 unstack
方法被從新安排到一個DataFrame
中,它的逆運算是 stack
:
對於一個DataFrame
,每條軸均可以有分層索引:
各層均可以有名字(能夠是字符串,也能夠是別的 Python 對象)。
注意⚠️不要將索引名稱跟軸標籤混爲一談。
有了分部的列索引,能夠輕鬆選取列分組。
能夠單首創建 MultiIndex
而後複用。上面的DataFrame
中的分級列能夠這樣建立:
重排分級順序
從新調整某條軸上各級別的順序,或根據指定級別上的值對數據進行排序。
swaplevel
:接受兩個級別編號或名稱,返回一個互換了級別的新對象,數據不發生改變:
sortlevel
:根據單個級別中的值對數據進行排序(獲得的最終結果是有序的)
根據級別彙總統計
level
選項:用於指定在某條軸上求和的級別。
以下所示,分別根據行或列上的級別來對行、對列進行求和:
使用DataFrame的列
將DataFrame
的一個或多個列當作行索引來用,或將行索引變成DataFrame
的列:
set_index
函數:將其一個或多個列轉換爲行索引,並建立一個新的DataFrame
。
默認狀況下,那些列會從DataFrame
中移除,也能夠將其保留下來:
reset_index
:將層次化索引的級別轉移到列裏面(和 set_index 相反)
不足之處,歡迎指正。