Pandas基礎使用(機器學習基礎)

語言: CN / TW / HK

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線性結構

這個呢,其實和我們的一維陣列其實是類似的。但是它的樣子要更加豐富一點。

image.png

image.png

image.png

我們不難發現其實我們的index其實和我們的字典是類似的,但是更加強大的是它可以像列表切片一樣。 當然我們也可以像字典一樣賦值

image.png

```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()

image.png

DataFrame結構

這個結構就和我們的sql表類似了。

image.png

關於它大建立那就其實和我們的Series類似了,只是我們多了一個東西,這個東西就和我們SQL表的欄位名一樣,沒錯這就是欄位名字。和我們的Excel的欄位名是一樣的。

image.png

現在我們來簡單地建立一張表。

```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 ```

image.png

對DataFrame進行操作

切片

首先我們不難發現就是我們先前是啥,是直接使用字典把值傳進去了,所以我們對於它的操作我們也可以這樣。

image.png

當然,我們也可以把它當做二維陣列來處理,但是我們這裡就需要使用到一些操作了。 我們預設是按照列優先的,現在我們要按照索引來。

image.png

image.png

```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],["語文","政治"]]) ```

轉置

image.png

排序

對DataFrame

使用df.sort_values(by=, ascending=) 單個鍵或者多個鍵進行排序, 引數: by:指定排序參考的鍵 ascending:預設升序ascending=Ture:

降序 ascending=False:降序

image.png

對兩個鍵排序是指第一個一樣比第二個。

對Series排序

這個就沒啥好說的了,直接排序。

df["語文"].sort_values(ascending=False)

這個和我們Series是一樣的DataFrame本來就是有Series組成的。

```python df=df.sort_values(by=["語文","數學"],ascending=False).head(3)#顯示前三個,預設顯示前五個

這裡注意的是改變之後我們的df需要重新接受

print(df) ```

修改索引

前面我們其實已經說了如何修改,但是這裡的話其實都是一樣的,只是有些細節要注意。 那就是,我們重新修改設定之後需要重新賦值。

image.png 注意我們這裡的話其實也是可以設定多個索引的

image.png

設定為多個索引之後我們管它叫做 MutiIndex。這個其實也是它的一種資料結構,

image.png

但是我把它歸為一個DataFrame一起。因為這個其實就是個DataFrame

運算

終於我們到了運算模組,這個還是比較重要的。

邏輯運算

image.png

image.png

統計運算

老師知道這個一定會笑死。

image.png

來我們單獨看看數學的平均成績

image.png

再看看各個科的成績

image.png

這不比Excel好用,直接讀取excel檔案,然後一個函式搞定。 (下次數學建模我就用pandas+sklearn/pytorch去玩玩,爭取明年幹個國獎) 萬金油~神經網路(狗頭)

那麼對應的API如下:

  • min(最小值)
  • max(最大值)
  • mean(平均值)
  • median(中位數)
  • var(方差)
  • std(標準差)
  • mode(眾數)

除此之外我們還有累計函式

image.png

有什麼用呢,我演示一下,你就知道了。

image.png

這個求經濟增長還是很有用的。

自定義運算

現在我們求每一個學科最高分和最低分的差值

image.png

繪圖

我們的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()

```

image.png

繪圖我們還有不同的樣式

DataFrame.plot (kind='line')

有:

line 線

bar 柱狀圖

barh 橫向柱狀圖

scatter 散點圖

等等

image.png

缺失值處理

這個其實很簡單,就是有些時候我們的資料會缺失。(一般時讀取某寫檔案的時候)

image.png

  1. isnull判斷是否有缺失資料NaN
  2. fillna實現缺失值的填充
  3. dropna實現缺失值的刪除
  4. replace實現資料的替換

  5. pd.isnull(df) 為空返回TRUE

  6. pd.notnull(df) 不為空返回TRUE

image.png

例如我們現在對全部的空值進行賦值平均值(覆蓋)

```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判斷

資料離散處理

這個其實沒啥,看我的操作就行了,現在我想要對我們的分數段進行劃分(對數學) 首先我想均勻分配

image.png

然後統計每個分數段的人數

image.png

我現在想看每個分數段的人數。

image.png

那麼這個就是所謂的離散處理。 作用還是蠻大的。

合併資料

終於快到尾聲了 合併資料就是合併表嘛。 我這邊重新準備了兩個資料,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 直接合並

這個沒啥就是直接合並!當然注意行和列。 我們先看到前三個和後三個

image.png

image.png

image.png

Merge合併

這個就厲害一點了,包括我們資料庫裡面的內外聯都能實現。

不懂這個沒關係,咱們有圖

result = pd.merge(left, right, on=['key1', 'key2'])

image.png

result = pd.merge(left, right,how="left", on=['key1', 'key2'])

image.png

result = pd.merge(left, right,how="right", on=['key1', 'key2'])

image.png result = pd.merge(left, right,how="outer", on=['key1', 'key2'])

image.png

我這邊就隨便舉個例子了,兩個表直接聯合

image.png

交叉表

這個呢,其實沒啥,給你看你就明白了

image.png

我這裡改一下,如果數學分數大於60就為1,反之為0

image.png

image.png

image.png

之後我們美化一下

```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()

```

image.png

分組聚合

我就直接舉一個例子,你就懂了 現在假設我是英語老師,我現在想看看,是不是語文不好的,英語也不好

image.png

結果發現可能不是。

讀取/儲存檔案

pandas可以讀取多種檔案

image.png

image.png

下面我以讀取csv檔案為例子,讀取的是我們昨天那個演示的成人的資料。

image.png

image.png

現在我不想要那麼多,我只想要一些,於是我可以這樣做。

image.png 之後是寫進去

image.png

image.png

image.png

總結

這些基本上都是比較常用的,應付辦公問題不大,適當地清洗資料問題也不大。那麼接下來就是機器學習的正式內容了。這裡我會分兩大類,一個是常見機器學習演算法,這一塊我們基於sklearn。還有一部分是我們的神經網路,也就是深度學習部分,這一部分我們基於pytorch(sklearn也能做,但是pytorch更香)。關於演算法的介紹的話,我會大概說說,這個演算法大致是怎麼樣的,然後呼叫哪些API,怎麼玩?(其實基本的機器學習演算法還是比較簡單的,只是理解使用的話,當然深入研究的話,我本科就能出期刊了,雖然曾經的老班,天天給我們打雞血 SCI小意思,我帶的XX學長都有,很簡單的~。但是肯定沒那麼輕鬆)