利用Python進行數據分析最核心的庫就是Pandas,可以說,掌握了Pandas庫,Python數據分析就屬於中階水平了。
在《一次簡單、完整的Python數據分析,讓我們不再害怕Python!》一文中我們介紹了Python進行數據分析全流程的幾個主要函數。但由於實際中的分析需求可能比較複雜,就要求對數據做更加複雜的處理。
所以,我們有必要提前準備一些常用的函數,這些函數不用全部會,知道有這些函數,並做到在我們要實現數據處理邏輯時,知道有什麼函數可用就夠了。
為了便於學習這些函數,本文按照各自類型進行了分門別類。
01幾點注意事項
在介紹具體的函數時,說幾點注意事項:
初學時最好習慣於寫參數名稱;根據函數的作用去理解它可以作用於哪種對象,又會返回何種對象;函數(也就是對象的方法)需要有括號,查看對象屬性沒有括號。axis=i,表示i維進行變化,而其他維度不變。例如,當i=0時,就是說行維度值進行變化,其它維度不變,這就表明是按列進行處理。
02常用函數
為了便於我們掌握,我們結合數據分析的流程和其內部函數的作用,將其分為以下幾類,具體見下圖。
(1)對象創建
pandas中有兩種重要對象:Series和DataFrame。前者類似一維數組,後者可看成Excel中的表格數據。後文將用df表示任意的DataFrame對象,用s表示任意的Series對象,用pd表示pandas庫。
pd.Series(data=, index=, dtype=,……)
#data可為列表、字典等多種類型,其餘參數為可選項
pd.DataFrame(data=, index=, columns=,……)
#data可為字典、數組等多種類型數據讀取
(2)數據讀取
數據讀取重點掌握以下三種。
pd.read_table(filename, sep='\t', header=0, index_col=None,……)
#要讀取的文件名稱是必須輸入的參數,其餘為可選項,header為要選取哪一行作為列名稱,默認第一行
pd.read_csv(filename, sep=',', header=0, index_col=None,……)
#與上面的函數用法大致相同
pd.read_excel(filename,sheet_name=0, header=0,index_col=None,……)
#從Excel文件讀入數據,增加了sheet_name參數的選項,代表要讀取第幾個工作表的數據
(3)數據描述
在讀完數據後,我們要先查看數據的整體情況。
df.info()
#查看數據框基本信息,包含多少行和列,每列什麼類型等等
df.descirbe()
#查看數據的整體描述,統計的是數值型列
df.head(n)
#查看前n行
df.tail(n)
#查看後n行
df.count(axis=0)
#非空值個數,返回Series,0為按列統計,1為按行統計
df.isna()
#返回每個元素是否是缺失值的bool數據框
df.isnull()
#返回每個元素是否是空值的bool數據框
df.columns
#返回Index類型的列的集合,因為列名稱是屬性,所以沒有括號
df.dtypes
#每一列的數據類型
df.index
#行索引名,返回Index類型的索引的集合
df.shape
#返回(行數,列數)格式的元組
df.values
#值的二維數組,返回numpy.ndarray對象
s.nunique()
#返回唯一值個數
s.unique()
#唯一值數據,返回array格式
(3)數據篩選
數據篩選的本質無外乎就是根據行和列的特性來選擇滿足我們需求的數據,掌握這些基本的篩選方法就可以組合複雜的篩選方法。
df["col1"]
#選擇某一列,返回的是Series類型
df[["col1"]]
#選擇某一列,返回的是DataFrame類型
df[df["col1"] > 1]
#選取滿足條件的行,
df["col"]>1
#返回的還是一個數據框,只是每個值為bool值
df.query("col1 > 1")
#這種方法也可選取滿足條件的行
df.loc[m:n]
#按照行索引選取m~n行,注意是包含n的
df.loc[m:n,'col1':'coln']
#注意loc函數的參數都是索引名
df.iloc[m:n]
#獲取從m~n-1行,iloc函數代表的是位置,即參數都是數字,代表第幾行第幾列
df.select_dtypes(include=None, exclude=None)
#按照數據類型選擇列
df.isin(values=)
#數據框中數據是否存在於values中,返回的是DataFrame類型
(4)數據清洗
數據清洗主要是一些重複值、缺失值和索引名稱等問題的處理。
df.duplicated(subset=["col"],keep=first)
#各行是否是重複行,返回Series,keep參數為first,last,False,first意思是第一次出現的重複值保留。
df.drop_duplicates(subset=["col"],keep=first,ignore_index=True)
#根據列刪除重複行,返回刪除後的結果數據
df.fillna(value=,inplace=)
#用value值填充na,返回填充後的結果數據df.dropna(axis=0,how='any',inplace=False)
#axis=0即行,how有『any』和『all』兩個選項,all表示所有值都為NA才刪除df.drop(labels=0,columns=['col1'],axis=0,)
#刪除指定列,也可以刪除行,axis作用不大
df.rename(index={'row1':'A'},columns={'col1':'A1'})
#重命名行索引和列名稱df.replace(to_replace=np.nan,value=0,inplace=False)
#替換df值,前後值可以用字典表示,如{"a":『A', "b":'B'}df.columns=pd.MultiIndex.from_tuples(indx)
#構建層次化索引
(5)數據處理
數據處理的範疇很廣,包含數據的統計匯總,也包含數據的轉換,做這一塊時腦中要同時進行抽象處理,便於查看邏輯是否有錯。
pd.merge(df1, df2, on='col1',left_on='col1',right_on='col2',how='inner',sort=False) #how有outer,left,right選項,默認inner,suffixes表示在相同的列名添加後綴
pd.concat([df1,df2,df3], axis=0,join='outer',ignore_index=False,keys=["x","y","z"])
#按行或是按列拼接多個數據框或Series,axis=0為按列拼接,即增加在行下面,key添加層次化索引
df1.append(df2,ignore_index=False)
#可為df也可為s,按列添加,即添加行,ignor_index=False意思是都按照原先的行索引值
df.stack(level=-1,dropna=True)
#列旋轉成行,也就是列名變為行索引名,原索引變成多層索引,evel表示選取哪個索引進行轉換,-1表示最內層的索引,0表示第一層索引
df.unstack(level=-1,fill_value=None)
#行轉列,默認從最內層索引開始df.pivot_table(index=["col1","col2"],values=["col3"],columns=["col4"],aggfunc="count")
#類似於Excel中的數據透視表,index表示選擇行,column是選擇列,values是進行函數計算的列
df.groupby(["col1"])#根據列對數據框進行分組,返回分組對象
df.groupby(["col1"])["col2"].count()#表示根據col1列進行分組,統計col2列的行數。這種方式是最為常用的統計匯總方法
df.agg({"col1":"count","col2":"sum"},axis=0) #agg是聚合的別名,表示對不同列用不同函數進行統計,返回Series對象
df.sort_values(by='col1',axis=0,ascending=True, inplace=False, na_position={"last","first"})
#按照某一列對數據框進行排序
df.apply(lambda x :x.max()-x.min(),axis=0)
#默認參數axis=0,表示按列對數據進行操作
df.applymap(lambda x : 1 if x>0 else 0)
#對數據框每一個數據進行操作,返回DataFrame格式
s.map(lambda x : 1 if x>0 else 0)
#對Series的每一個數據進行,不能對DataFrame操作
s.value_counts()
#對Series中數據進行分類匯總
pd.cut(s,bins=[-np.inf,0,np.inf],labels=list("abc"))
#bins為左開右閉區間,將Series數據進行分類
df.where(df<0,0) #與numpy的where函數有不同,後面的值表示不滿足條件的賦值為0,滿足的話就不變
pd.date_range(start='2020-01-01',end='2020-02-01',periods=,freq="D")
#periods為期數,注意不要衝突,freq為類型,種類有很多,默認是天,M為月尾,MS為月初
03結語
函數還有很多,但都不太常見了。我們平時學習的時候可以養成記筆記的好習慣,即把出現的函數記下來,分門別類地匯總在一起,等記不清時就可以直接在匯總中查找了,閒暇時也可以瞅一瞅,這樣次數多了後就會慢慢全部記住了。