超全的pandas數據分析常用函數總結:下篇
- 2020 年 4 月 2 日
- 筆記
大家好,我是雅痞紳士JM

基礎知識在數據分析中就像是九陽神功,熟練的掌握,加以運用,就可以練就深厚的內力,成為絕頂高手自然不在話下!
為了更好地學習數據分析,我對於數據分析中pandas這一模組裡面常用的函數進行了總結。整篇總結,在詳盡且通俗易懂的基礎上,我力求使其有很強的條理性和邏輯性,所以製作了思維導圖,對於每一個值得深究的函數用法,我也會附上官方鏈接,方便大家繼續深入學習。
文章中的所有程式碼都會有講解和注釋,絕大部分也都會配有運行結果,醬紫的話,整篇總結篇幅量自然不小,所以我分成了上下兩篇,這裡是下篇。
5. 數據預處理
先創建一個data2數據集
data2=pd.DataFrame({ "id":np.arange(102,105), "profit":[1,10,2] }) data2
輸出結果:

再創建一個data3數據集
data3=pd.DataFrame({ "id":np.arange(111,113), "money":[106,51] }) data3
輸出結果:

5.1 數據的合併
用merge合併
DataFrame.merge(self,right,how =『inner』,on = None)
- right指要合併的對象
- on指要加入的列或索引級別名稱,必須在兩個DataFrame中都可以找到。
- how決定要執行的合併類型:left(使用左框架中的鍵)、right、inner(交集,默認)、outer(並集)
data_new=pd.merge(data,data2,on='id',how='inner') # 默認取交集 data_new=pd.merge(data,data2,on='id',how='outer') # 取並集,沒有值的地方填充NaN data.merge(data2,on='id',how='inner') # 另一種寫法,輸出結果見下方
輸出結果:

更多關於pandas.DataFrame.merge的用法,戳下面官方鏈接:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html
data.merge(data2,on='id',how='left') # 使用左框架中的鍵
輸出結果:

用append合併
data.append(data2) # 在原數據集的下方合併入新的數據集
輸出結果:

用join合併
用下面這種方式會報錯:列重疊,且沒有指定後綴,因為上面的數據data和data2都有「id」列,所以需要給id列指明後綴。
data.join(data2) # 會報錯
第一種修改方式:
data.join(data2,lsuffix='_data', rsuffix='_data2')
輸出結果:

第二種修改方式:
data.set_index('id').join(data2.set_index('id'))
輸出結果:

更多關於pandas.DataFrame.join的用法,戳下面官方鏈接:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.join.html
用concat合併
pandas.concat(objs,axis = 0,ignore_index = False,keys = None)
- objs:Series,DataFrame或Panel對象的序列或映射。
- axis:串聯的軸,默認為0,即以索引串聯(豎直拼接);如果為1,則以列串聯(水平拼接)
- ignore_index:清除現有索引並將其重置,默認為False。
- key:在數據的最外層添加層次結構索引。
data_new=pd.concat([data,data2,data3],axis = 1,keys=['data', 'data2','data3']) data_new
輸出結果:

更多關於pandas.concat的用法,戳下面官方鏈接:
https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.concat.html
5.2 設置索引列
data.set_index("id") # 設置id為索引列
輸出結果:

data.reset_index(drop=True) # 重置索引列,並且避免將舊索引添加為列
輸出結果:

5.3 按照特定列的值排序:
按照索引列進行排序:
data.sort_index()
按照money的值進行排序:
data.sort_values(by="money",ascending = True) # ascending默認為True,即升序.
輸出結果:

5.4 分類顯示
如果money列的值>=10, level列顯示high,否則顯示low:
data['level'] = np.where(data['money']>=10, 'high', 'low') data
輸出結果:

5.5 分組標記
data.loc[(data['level']=="high") & (data['origin']=="China"),"sign"]="棒" data
輸出結果:

5.6 切割數據
對date欄位的值依次進行分列,並創建數據表,索引值為data的索引列,列名稱為yearmonthday。
data_split = pd.DataFrame((x.split('-') for x in data['date']), index=data.index, columns=['year','month','day']) data_split
輸出結果:

再與原數據表進行匹配:
pd.concat([data,data_split],axis=1)
輸出結果:

6. 數據提取
下面這部分會比較繞:
loc函數按標籤值進行提取,iloc按位置進行提取pandas.DataFrame.loc() 允許輸入的值:
- 單個標籤,例如5或』a』,(請注意,5被解釋為索引的標籤,而不是沿索引的整數位置)。
- 標籤列表或數組,例如。[『a』, 『b』, 『c』]
- 具有標籤的切片對象,例如』a』:『f』,切片的開始和結束都包括在內。
更多關於pandas.DataFrame.loc的用法,戳下面官方鏈接:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.loc.html#pandas.DataFrame.loc
pandas.DataFrame.iloc()
允許輸入的值:整數5、整數列表或數組[4,3,0]、整數的切片對象1:7
更多關於pandas.DataFrame.iloc的用法,戳下面官方鏈接:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.iloc.html#pandas.DataFrame.iloc
6.1 單行索引
data.loc[6] # 提取索引值為6的那一行(即輸出第7行)
輸出結果:

data.iloc[6] # 提取第7行
輸出結果同上!
6.2 區域索引
6.2.1 用loc取連續的多行
提取索引值為2到索引值為4的所有行,即提取第3行到第5行,注意:此時切片的開始和結束都包括在內。
data.loc[2:4]
輸出結果:

提取「2020-03-13」之前的所有數據
data.loc[:"2020-03-13"]
輸出結果:

6.2.2 用loc取不連續的多行
提取索引值為2和索引值為4的所有行,即提取第3行和第5行。
data.loc[[2,4]]
輸出結果:

6.2.3 用loc取具體值
data.loc[6,"id"]
輸出結果:107
6.2.4 用iloc取連續的多行
提取第3行到第6行
data.iloc[2:6]
輸出結果:

6.2.5 用iloc取連續的多行和多列
提取第3行到第6行,第4列到第5列的值,取得是行和列交叉點的位置。
data.iloc[2:6,3:5]
輸出結果:

6.2.6 用iloc取不連續的多行和多列
提取第3行和第6行,第4列和第5列的交叉值
data.iloc[[2,6],[3,5]]
輸出結果:

6.2.7 用iloc取具體值
提取第3行第7列的值
data.iloc[2,6]
輸出結果:『high』
總結:文字變程式碼,數值少1;程式碼變文字,數值加1;程式碼從0開始計數;文字從1開始計數。
6.3 值的判斷
方式一:判斷origin列的值是否為China
data['origin']=="China"
方式二:判斷department列的值是否為水果
data['department'].isin(['水果'])
輸出結果:

data['department'].isin(['水果']).sum() # 對判斷後的值進行匯總
輸出結果:1
6.4 提取符合判斷的值
data.loc[data['origin'].isin(['Thailand'])] # 將產地是泰國的數據進行提取
輸出結果:

7. 數據篩選
7.1 使用與、或、非進行篩選
將滿足origin是China且money小於35這兩個條件的數據,返回其id、date、money、product、department、origin值。
data.loc[(data['origin']=="China") & (data['money']<35),['id','date','money','product','department','origin']]
輸出結果:

將滿足origin是China或者money小於35這兩個條件之中任意一個條件的數據,返回其id、date、money、product、department、origin值。
data.loc[(data['origin']=="China") | (data['money']<35),['id','date','money','product','department','origin']]
輸出結果:

將滿足origin是China且money不小於10這兩個條件的數據,返回其id、date、money、product、department、origin值。
data.loc[(data['origin']=="China") != (data['money']<10),['id','date','money','product','department','origin']]
輸出結果:

7.2 使用query函數進行篩選
data.query('department=="飲料"') # 單個條件篩選 data.query('department==["飲料","零食"]') # 多個條件篩選
輸出結果:

更多關於pandas.DataFrame.query的用法,戳下面官方鏈接:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.query.html
7.3 對結果進行計數求和
data.query('department=="飲料"').count() # 對飲料類型的數據進行篩選後計數 data.query('department=="飲料"').money.count() # 對篩選後的數據按照money進行計數
輸出結果:2
data.query('department=="飲料"').money.sum() # 在篩選後的數據中,對money進行求和
輸出結果:9.0
8. 數據匯總
8.1 以department屬性對所有列進行計數匯總
data.groupby("department").count()
輸出結果:

8.2 以department屬性分組之後,對id欄位進行計數匯總
data.groupby("department")['id'].count()
輸出結果:

8.3 以兩個屬性進行分組計數
data.groupby(["department","origin"]).count()
輸出結果:

8.4 以department屬性進行分組匯總並計算money的合計與均值
data.groupby("department")['money'].agg([len, np.sum, np.mean])
輸出結果:

9. 數據統計
9.1 數據取樣
pandas.DataFrame.sample(n = None,replace = False,weights = None)
- n:樣本數
- replace:樣本有無更換(有無放回)(默認不放回)
- weights:權重
更多關於pandas.DataFrame.sample的用法,戳下面官方鏈接:https://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.sample.html
data.sample(3,replace=True,weights=[0.1,0.1,0.2,0.2,0.1,0.1,0.1,0.1,0,0])
輸出結果:

9.2 描述性統計
data.describe().round(2).T # round表示小數位數,T表示轉置(這一函數之前提及過)
輸出結果:

9.3 計算標準差
data['money'].std()
輸出結果:18.14754345175493
9.4 計算協方差
data.cov()
輸出結果:

9.5 相關性分析
data.corr()
輸出結果:

思維導圖
