標籤:

Python學習筆記-Pandas學習手冊

Pandas手冊

為什麼需要Pandas

Pandas(panel data & Data Analysis)是基於Numpy的專門用於數據分析的庫,處理大型的結構化表格數據尤其方便。pandas借鑒了R的數據結構,並支持numpy中定義的計算(比如矩陣運算),另外,底層用Cython和C做了很多速度上的優化。總之,Pandas是數據分析工作者使用Python時最常使用的庫。

關鍵縮寫和包導入

在這個速查手冊中,我們使用如下縮寫:

df:任意的Pandas DataFrame對象

s:任意的Pandas Series對象

同時我們需要做如下的引入:

import pandas as pd

import numpy as np

from pandas import Series,DataFrame

Pandas的數據結構及創建方法

  • Series包含一組數據(值,一維)以及與之相對應的一組數據標籤(索引,只能整體賦值),另外,它們都有一個name屬性
  • Series(my_list,index)#從可迭代對象my_list(列表,ndarray,字典等)創建一個Series對象。以字典構建Series時索引可以自由地指定,結果會按索引排序
  • DataFrame是一個表格型的數據結構,它含有一組有序的列,每列可以是不同的值類型,可以看做是由Series組成的字典
  • DataFrame(data,columns,index)#data最常見的形式由等長列表或數組組成的字典,columns即字典鍵值可自由指定,index長度必須同data長度相等;data為嵌套字典時,外層字典的鍵作為列,內層鍵則作為行索引;data為二維ndarray時,行標列標的長度都應嚴格對應

簡單是數據檢查

  • df.head(n):查看DataFrame對象的前n行
  • df.tail(n):查看DataFrame對象的最後n行
  • df.shape():查看DataFrame的形狀
  • df.info():查看索引、數據類型和內存信息
  • df.describe():查看數值型列的匯總統計,標籤值

數據選取/切片

  • df[col]:根據列名,並以Series的形式返回列,df[[col]]返回的是DataFrame格式
  • df[[col1, col2]]:以DataFrame形式返回多列
  • df[a:b]#如果ab是數值,默認是行切片,區間是[a,b),即普通的數值切片;如果ab是標籤值,則是[a,b],包含末端,需注意,標籤值的切片默認列優先,但標籤值列切片卻不能用[a:b]這種方法
  • df.ix[:3,:2],df.ix[:3,[0,1,2]]#ix最方便,表示前3行前兩列,使用方法與ndarray完全相同,也可用標籤值來切片
  • iloc方法#根據索引的整數位置選取行列,不會出現整數索引跟標籤索引混淆的情況
  • DataFrame(df,columns=,index=)#這種方法得到的結果不能進行賦值操作
  • df[列][行]=df.ix[[行],[列]]=df.ix[行][列]#這3中方法等價,生成相應的視圖,結果能賦值

數據存儲I/O

  • pd.read_csv(path,sep,header,index_col,names,skiprows,na_values,nrows):從CSV文件導入數據,默認分隔符是逗號。sep一般是固定的分隔符或正則;header指用作列名的行號,默認0,可指定為其它數字或None;index_col指用作行索引的列名列編號(可以是一組);names指定列名的列表(一般結合header=None),na_values指要替換為Na的值,可以是列名對應的字典;nrows限定讀取的行數
  • pd.read_table(filename):從限定分隔符的文本文件導入數據,默認分隔符為製表符,,主要參數同上
  • pd.read_excel(filename):從Excel文件導入數據
  • pd.read_sql(query, connect):從SQL表/庫導入數據,connect可以通過sqlite3,pymysql,pymssql三個庫的函數來定義
  • pd.read_json(json_string)、json.loads():從JSON格式的字元串導入數據;
  • pd.read_clipboard():從你的粘貼板獲取內容,並傳給read_table(),,在將網頁轉換為表格時很有用
  • pd.DataFrame(dict):從字典對象導入數據,Key是列名,Value是數據
  • df.to_csv(filename):導出數據到CSV文件,可以指定分隔符和保存的行列等
  • df.to_excel(filename):導出數據到Excel文件
  • df.to_sql(table_name, connection_object):導出數據到SQL表
  • df.to_json(filename)、json.dumps():以Json格式導出數據到文本文件;
  • csv.reader(open(filename))得到由行列表組成的可迭代對象;csv.writer(open(filename,wb)).writerrow(datarow)寫入數據

元素級函數(ufunc)應用及聚合統計函數

  • df1+df2,df1.add(df2,fill_value=0)#行列索引是兩者的並集,沒有重疊的位置是NaN,,不指定缺失值填充的話,前後等價,,計算順序是先按照對應位置填充缺失值再計算,計算結果仍可能有缺失值哦
  • df1-df2,df1.sub(df2)#重疊的部分相減,其它地方缺失
  • df1*df2===df1.mul(df2) df1/df2===df1.div(df2)
  • DataFrame與Series之間的運算遵循廣播原則,實際是DataFrame的每一列與Series相運算,即Series之間的運算。默認是在行上廣播(在軸1上匹配在軸0上廣播),在列上廣播需要指定df.sub(s,axis=0)
  • np.func(df),df.apply(func)#兩種調用ufunc的方法,第二種方法還能調用自定義函數。比如,f=lambda x:x.max()-x.min();df.apply(f),默認是在軸0(行)上應用函數,一般意味著行的坍塌。df.apply(f,axis=1)指定在列上應用
  • s.unique(),pd.value_counts(s)#Series的兩個函數,求唯一值數組和值計數
  • df.describe():查看數據值列的匯總統計,如果是非數值則是另外一種統計方式
  • df.sum(axis,skipna,level)#求和,默認在axis=0上計算,skipna指是否跳過缺失值,默認為True,全部Na的和是0
  • df.max(),df.min()#求最大值最小值,參數同上。skipna=True時,全部Na的和是Na
  • df.corr(method):返回列與列之間的相關係數(包含缺失值),method是相關係數的類型pearson(默認),kendall,spearman
  • df.count(axis):返回指定軸上非空值的個數
  • df.mean(axis,skipna,level),df.std(ddof):返回指定軸的均值和標準差,自由度ddof默認為1
  • argmin,argmax#計算最小值和最大值的索引位置(整數)
  • idxmin,idxmax#計算最小值和最大值的索引值
  • df.cumsum(),df.cumprod()#樣本值的累計和和累計乘積,默認跳過缺失值,Na對應的累加值Na
  • diff#計算一階差分(對時間序列很有用)

排序與排名

  • df.sort_index(axis,ascending)#按索引排序,默認是在軸0上升序排列,ascending=False則降序
  • s.sort_values#按值排序,相同值按索引序列排序(正序逆序有差別),缺失值永遠在最後面(按索引正序排列)
  • df.sort_values(by=[a,b])#指在a列b列上排序,a主b副,,這樣的方法只能在axis=0上排序
  • df.sort_values([col1,col2], ascending=[True,False]):先按列col1升序排列,後按col2降序排列數據
  • df.rank(axis,ascending,method)#排名函數返回索引對應的名次,method有『average』默認在相等分組中,為各個值分配平均排名,『min』,『max』(使用整個分組的最小/最大排名)和『first』按值在原始數據中的出現順序分配排名

數據規整

  • df.dropna(axis,how)#丟棄缺失值,默認是去掉含有Nan的行,how=all指去不為Nan才丟棄
  • fillna(value,method,axis,inplace,limit)#value是指填充的值,method有ffill,bfill等,inplace默認是False,指填充後返回新對象而源數據不變。還可用字典(每列賦值不同)給缺失值賦值
  • s.astype(float):將Series中的數據類型更改為float類型
  • obj.reindex(arr)#obj可以是Series或者DataFrame,arr既可以是index對象或其它序列型的Python數據結構,默認是更改index,也可以指定為更改columns。以上都可以通過Series和DataFrame重新生成的操作達到,但reindex函數還有一些缺失值處理參數。fill_value直接給缺失值賦值,method=ffill/bfill(向前填充或向後填充),limit指定最大填充量
  • df.drop(arr,axis)#丟棄指定軸上的一個或多個項,默認axis=0,即行index。Series可同樣操作,,drop並不改變源數據,而del是直接操作源數據,且只能刪一列
  • df.stack(),df.unstack()#構建和展開層次化索引,默認從最內層索引開始,可以傳入分層的名稱或編號來設置
  • df.swaplevel(key1,key2)#調整索引的級別
  • df.sortlevel()#由外到內排序,最外層的索引級別是0
  • df.set_index(drop=True),reset_index()#將列轉換為行索引及其反功能函數,drop指該列是否在數據中刪除
  • df.to_panel(),pl.to_frame()#DataFrame與Panel面板數據(3維ndarray)的相互轉化
  • s.map(字典或函數)#創建一個元素級的映射,可以是字典也可以是函數
  • data.replace()#替換元素,可以是單值,可以是數組,也可以是字典(相當於map函數),fillna可以看做特殊的replace
  • df.rename(index,columns)#通過函數或字典來更改軸索引,橫軸縱軸都能改
  • pd.cut(arr,bin)#數據離散化,返回一個特殊的Categorical對象,默認左開右閉。如果bin是數值,則根據arr的最小值和最大值計算等長面元;如果bin是數組,則直接根據數組裡的值創建區間
  • pd.qcut(data,[0,0.1,0.5,0.8,1])#qcut類似cut,它按樣本大小劃定區間而不是考慮區間大小;如果傳入整數n,則得到樣本大小基本相等的n個面元區間
  • pd.get_dummies(df[col], prefix)#將DataFrame中的某一列標籤化,prefix是轉換後列名的前綴
  • df.drop_duplicates(col,keep)#移除重複行,默認按全部列判斷是否重複(不包括索引),也可以指定列名,,默認保留一組重複值里的第一個,可用keep參數設置為last

數據分組,透視表及數據組合

  • df.groupby(col):返回一個按列col進行分組的Groupby對象,col還可以是一組列、一組等長數組或是字典,分組後默認分組鍵會變成索引(可以傳入參數as_index=False來),可以用axis指定分組的軸,默認是0;甚至可以用函數分組,比如df.groupby(len).sum()指按索引值的長度分組
  • grouped.agg(func)#對分組進行運算,func是被引用的函數,可以是numpy里的函數或是自定義等,,可一次引入一組函數[func1,func2,func3],,可以傳入元組或字典給結果賦值,相當於SQL裡面的as,grouped.agg([(name1,func1),(name2,func2)])
  • grouped.transform(func)#transform除了在分組上進行運算,結果的索引與源數據的索引相同(所以有時候需要廣播)
  • data.apply(func)#apply是最一般化的分組函數調用方法,agg/tranfrom算是它的特殊使用,它是在各組上運行函數後,將結果用pd.concat組合在一起;其中可以一併傳入函數的其它參數
  • df.pivot(col1,col2)#轉換透視表的快捷方式,相當於用set_index創建層次化索引,再用unstack重塑
  • df.pivot_table(values=[col1,col2],rows=col3,cols=col4, aggfunc=max):創建一個數據透視表,行拖入col3,列拖入col4,計算col1和col2上的最大值,margins可以指定是否添加總計
  • df1.join(df2,on=col1,how=inner):對df1的列和df2的列執行SQL形式的join,默認按索引合併,一次可連接多個DataFrame
  • pd.merge(df1,df2,left_on,right_on,how,on)#默認以相同名稱的列合併,沒有相同值是使用left_on,right_on來指定,有多個相同名稱列是用on來指定,how默認是左連接,,還有left_index/right_index可以將索引用作連接鍵
  • df.concat([df1, df2],axis=1,how,keys=[]):將df2中的列添加到df1的尾部,默認是在axis=0上工作的,默認是outer,,keys可以是列名或索引,,ignore_index=True會去掉舊索引生成新索引

jupyter notebook筆記,鏈接:pan.baidu.com/s/1qYFJGE 密碼:3x57

參考文檔:

1、官方文檔:Python Data Analysis Library

2、《利用Python進行數據分析》老鼠書Pandas章節:Jupyter Notebook Viewer

3、笑虎老師的pandas速查手冊:Pandas速查手冊中文版 - 知乎專欄


推薦閱讀:

給大家看點好玩的,用Python畫牛頓分形
python模擬登陸的時候,別人用的是js生成的驗證碼(純字元)如何獲得生成的動態頁面?
數據挖掘進階:kaggle競賽top代碼分享
python 3.5 中 PEP0484 新加入的 Type Hints 的使用方法是什麼?
Stackoverflow上百萬的Python問題|最火的十個

TAG:Python | 學習 |