Pandas基礎使用(機器學習基礎)
theme: channing-cyan highlight: agate
「這是我參與2022首次更文挑戰的第5天,活動詳情檢視:2022首次更文挑戰」
前言
終於到了我們三大套件的最後一個套件了Pandas,這個哥們相當牛皮,不管是機器學習還是爬蟲資料清洗,再或者是辦公都相當幫。所以說這個庫我認為其實是每一個pythoner都必須學習的庫,因為真的很實用,支援excel,cvs,sql。給你們看一下程式碼你們就能感受到了 ```python
import pymysql import pandas as pd
con = pymysql.connect(host="127.0.0.1",user="root",password="password",db="Huterox")
讀取sql
data_sql=pd.read_sql("SQL查詢語句",con)
儲存
data_sql.to_csv("test.csv") ```
或者,你直接將sql的表讀進去,然後當中pandas的資料結構去操作。 ```python import pandas as pd import pymysql from sqlalchemy import create_engine
con = create_engine('mysql+pymysql://user_name:[email protected]:3306/database_name') data = pd.read_sql_table("table_name", con) data.to_csv("table_name.csv") ``` 所以說,理論上如果你只是想要玩資料操作的話,你甚至可以不需要專門去學習sql(當然最好還是學習的,但如果你是辦公人群,只是有特殊需求的話,確實可以考慮)
所以問題來了,竟然它如此強大,那麼也就意味著,它的內容較多。我將盡可能地去說明經常使用的內容,最起碼在檢視別人操作的時候能夠看懂。
在學習pandas之前我們必須先了解pandas處理後的資料結構是怎麼樣的,這樣一來我們就能夠進行操作。
Pandas的基本資料結構
Series線性結構
這個呢,其實和我們的一維陣列其實是類似的。但是它的樣子要更加豐富一點。
我們不難發現其實我們的index其實和我們的字典是類似的,但是更加強大的是它可以像列表切片一樣。 當然我們也可以像字典一樣賦值
```python import pandas as pd index = ["第{}個數字".format(i) for i in range(1,5)] series = pd.Series([1,2,3,4],index=index,dtype=float) series print(series[0]) print(series["第2個數字"]) print(series[1:3])
```
此外我們還可以修改索引。
```python import pandas as pd index = ["第{}個數字".format(i) for i in range(1,5)] series = pd.Series([1,2,3,4],index=index,dtype=float) series
print(series[0])
print(series["第2個數字"])
print(series[1:3])
index_new = ["第{}個數字New".format(i) for i in range(1,5)] series.index = index_new series.reset_index(drop=True) series ```
但是這裡要注意一點,那就是關於 reset_index()
DataFrame結構
這個結構就和我們的sql表類似了。
關於它大建立那就其實和我們的Series類似了,只是我們多了一個東西,這個東西就和我們SQL表的欄位名一樣,沒錯這就是欄位名字。和我們的Excel的欄位名是一樣的。
現在我們來簡單地建立一張表。
```python import pandas as pd import numpy as np
score = np.random.randint(60, 100, (10, 5))
構造行索引序列
subjects = ["語文", "數學", "英語", "政治", "體育"]
構造列索引序列
stu = ['同學' + str(i) for i in range(1,score.shape[0]+1)]
df = pd.DataFrame(score,columns=subjects,index=stu) df ```
對DataFrame進行操作
切片
首先我們不難發現就是我們先前是啥,是直接使用字典把值傳進去了,所以我們對於它的操作我們也可以這樣。
當然,我們也可以把它當做二維陣列來處理,但是我們這裡就需要使用到一些操作了。 我們預設是按照列優先的,現在我們要按照索引來。
```python import pandas as pd import numpy as np
score = np.random.randint(60, 100, (10, 5))
構造行索引序列
subjects = ["語文", "數學", "英語", "政治", "體育"]
構造列索引序列
stu = ['同學' + str(i) for i in range(1,score.shape[0]+1)]
df = pd.DataFrame(score,columns=subjects,index=stu) print(df.loc["同學1":"同學3"]) print(df.loc["同學1":"同學3"]["語文"]) print(df.iloc[0:3,0:3]) print(df.loc[df.index[0:3],["語文","政治"]]) ```
轉置
排序
對DataFrame
使用df.sort_values(by=, ascending=) 單個鍵或者多個鍵進行排序, 引數: by:指定排序參考的鍵 ascending:預設升序ascending=Ture:
降序 ascending=False:降序
對兩個鍵排序是指第一個一樣比第二個。
對Series排序
這個就沒啥好說的了,直接排序。
df["語文"].sort_values(ascending=False)
這個和我們Series是一樣的DataFrame本來就是有Series組成的。
```python df=df.sort_values(by=["語文","數學"],ascending=False).head(3)#顯示前三個,預設顯示前五個
這裡注意的是改變之後我們的df需要重新接受
print(df) ```
修改索引
前面我們其實已經說了如何修改,但是這裡的話其實都是一樣的,只是有些細節要注意。 那就是,我們重新修改設定之後需要重新賦值。
注意我們這裡的話其實也是可以設定多個索引的
設定為多個索引之後我們管它叫做 MutiIndex。這個其實也是它的一種資料結構,
但是我把它歸為一個DataFrame一起。因為這個其實就是個DataFrame
運算
終於我們到了運算模組,這個還是比較重要的。
邏輯運算
統計運算
老師知道這個一定會笑死。
來我們單獨看看數學的平均成績
再看看各個科的成績
這不比Excel好用,直接讀取excel檔案,然後一個函式搞定。 (下次數學建模我就用pandas+sklearn/pytorch去玩玩,爭取明年幹個國獎) 萬金油~神經網路(狗頭)
那麼對應的API如下:
- min(最小值)
- max(最大值)
- mean(平均值)
- median(中位數)
- var(方差)
- std(標準差)
- mode(眾數)
除此之外我們還有累計函式
有什麼用呢,我演示一下,你就知道了。
這個求經濟增長還是很有用的。
自定義運算
現在我們求每一個學科最高分和最低分的差值
繪圖
我們的Pandas裡面其實封裝了很多關於matplotlib的內容 所以我們其實是可以直接繪圖的。
```python import matplotlib.pyplot as plt from pylab import mpl
設定顯示中文字型
mpl.rcParams["font.sans-serif"] = ["SimHei"]
設定正常顯示符號
mpl.rcParams["axes.unicode_minus"] = False tx1 = df.loc["同學1"] tx1.plot() plt.show()
```
繪圖我們還有不同的樣式
DataFrame.plot (kind='line')
有:
line 線
bar 柱狀圖
barh 橫向柱狀圖
scatter 散點圖
等等
缺失值處理
這個其實很簡單,就是有些時候我們的資料會缺失。(一般時讀取某寫檔案的時候)
- isnull判斷是否有缺失資料NaN
- fillna實現缺失值的填充
- dropna實現缺失值的刪除
replace實現資料的替換
pd.isnull(df) 為空返回TRUE
- pd.notnull(df) 不為空返回TRUE
例如我們現在對全部的空值進行賦值平均值(覆蓋)
```python for i in df.columns: if np.all(pd.notnull(df[i])) == False: print(i) df[i].fillna(df[i].mean(), inplace=True)
df=df.replace(to_replace='?', value=np.nan)替換為?
df = df.dropna() 直接刪掉空的
``` 我們使用numpy的all判斷
資料離散處理
這個其實沒啥,看我的操作就行了,現在我想要對我們的分數段進行劃分(對數學) 首先我想均勻分配
然後統計每個分數段的人數
我現在想看每個分數段的人數。
那麼這個就是所謂的離散處理。 作用還是蠻大的。
合併資料
終於快到尾聲了 合併資料就是合併表嘛。 我這邊重新準備了兩個資料,df,df1
```python import pandas as pd import numpy as np
score = np.random.randint(60, 100, (10, 5)) score2 = np.random.randint(60, 100, (10, 5))
構造行索引序列
subjects = ["語文", "數學", "英語", "政治", "體育"]
構造列索引序列
stu = ['同學' + str(i) for i in range(1,score.shape[0]+1)]
df = pd.DataFrame(score,columns=subjects,index=stu,dtype=float) df2 = pd.DataFrame(score2,columns=subjects,index=stu,dtype=float) ```
concat 直接合並
這個沒啥就是直接合並!當然注意行和列。 我們先看到前三個和後三個
Merge合併
這個就厲害一點了,包括我們資料庫裡面的內外聯都能實現。
不懂這個沒關係,咱們有圖
result = pd.merge(left, right, on=['key1', 'key2'])
result = pd.merge(left, right,how="left", on=['key1', 'key2'])
result = pd.merge(left, right,how="right", on=['key1', 'key2'])
result = pd.merge(left, right,how="outer", on=['key1', 'key2'])
我這邊就隨便舉個例子了,兩個表直接聯合
交叉表
這個呢,其實沒啥,給你看你就明白了
我這裡改一下,如果數學分數大於60就為1,反之為0
之後我們美化一下
```python df["數學"]=np.where(df["數學"]>=60,0,1) df["語文"]=np.where(df["語文"]>=60,0,1)
count = pd.crosstab(df["數學"],df["語文"]) sum = count.sum(axis=1) print(count) pro = count.div(sum,axis=0)
print(pro)
pro.plot(kind='bar', stacked=True)#TRUE疊加 plt.show()
```
分組聚合
我就直接舉一個例子,你就懂了 現在假設我是英語老師,我現在想看看,是不是語文不好的,英語也不好
結果發現可能不是。
讀取/儲存檔案
pandas可以讀取多種檔案
下面我以讀取csv檔案為例子,讀取的是我們昨天那個演示的成人的資料。
現在我不想要那麼多,我只想要一些,於是我可以這樣做。
之後是寫進去
總結
這些基本上都是比較常用的,應付辦公問題不大,適當地清洗資料問題也不大。那麼接下來就是機器學習的正式內容了。這裡我會分兩大類,一個是常見機器學習演算法,這一塊我們基於sklearn。還有一部分是我們的神經網路,也就是深度學習部分,這一部分我們基於pytorch(sklearn也能做,但是pytorch更香)。關於演算法的介紹的話,我會大概說說,這個演算法大致是怎麼樣的,然後呼叫哪些API,怎麼玩?(其實基本的機器學習演算法還是比較簡單的,只是理解使用的話,當然深入研究的話,我本科就能出期刊了,雖然曾經的老班,天天給我們打雞血 SCI小意思,我帶的XX學長都有,很簡單的~。但是肯定沒那麼輕鬆)
- 還在調API寫所謂的AI“女友”,嘮了嘮了,教你基於python咱們“new”一個(深度學習)
- Java前後端分離實戰Auto2.0使用者登入註冊--基本的使用者登入 郵箱驗證
- 卡爾曼濾波器(目標跟蹤一)(上)
- 手把手教你如何自制目標檢測框架(從理論到實現)
- 基於Python深度圖生成3D點雲
- Pandas基礎使用(機器學習基礎)
- CEC2017基礎函式說明Python版本
- 全國空氣質量爬取實戰
- 智慧演算法整合測試平臺V0.1實戰開發
- DDPG神經網路實戰(基於強化學習優化粒子群演算法)
- 關於強化學習優化粒子群演算法的論文解讀(全)
- 關於強化學習優化粒子群演算法的論文解讀(上)
- 基於多種群機制的PSO演算法(優化與探索三 *混合種群思想優化多種群與廣義PSO求解JSP)
- 基於多種群機制的PSO演算法Python實現(優化與探索二)
- 基於多種群機制的PSO演算法Python實現
- 520桌面手勢告白
- 嘿~瞎話一下,為啥要用Sigmoid?!