14 個 pandas 神操作,手把手教你寫代碼
**導讀:**Pandas 是 Python 數據分析的利器,也是各種數據建模的標準工具。本文帶大家入門 Pandas,將介紹 Python 語言、Python 數據生態和 Pandas 的一些基本功能。
在 Python 語言應用生態中,數據科學領域近年來十分熱門。作爲數據科學中一個非常基礎的庫,Pandas 受到了廣泛關注。Pandas 可以將現實中來源多樣的數據進行靈活處理和分析。
0****1
Pandas 是什麼
很多初學者可能有這樣一個疑問:“我想學的是 Python 數據分析,爲什麼經常會被引導到 Pandas 上去?” 雖然這兩個東西都是以 P 開頭的,但它們並不是同一個層面的東西。簡單來說,Pandas 是 Python 這門編程語言中一個專門用來做數據分析的工具,它們的關係如圖 1 所示。接下來我們就說說 Python 是什麼,Pandas 又是什麼。
圖 1 Pandas 和 Python 的關係
Python 簡介
Python 是一門強大的編程語言,它簡單易學,提供衆多高級數據結構,讓我們可以面向對象編程。Python 是一門解釋型語言,語法優雅貼近人類自然語言,符合人類的認知習慣。
Python 支持跨平臺,能夠運行在所有的常見操作系統上。Python 在近期熱門的大數據、科學研究、機器學習、人工智能等領域大顯身手,並且幾乎在所有領域都有應用,因此學習它十分划算。
Python 由荷蘭人吉多 · 範羅蘇姆(Guido van Rossum)創造,第一版發佈於 1991 年。關於爲何有 Python 這個項目,吉多 · 範羅蘇姆在 1996 年曾寫道:6 年前,也就是 1989 年 12 月,我在尋找一門 “課餘” 編程項目來打發聖誕節前後的時間。到時我的辦公室會關門,而我只有一臺家用電腦,沒有什麼其他東西。我決定爲我當時正在構思的新的腳本語言寫一個解釋器,它是 ABC 語言的後代,對 UNIX/C 程序員會有吸引力。當時我對項目叫什麼名字並不太在乎,由於我是《蒙提 · 派森的飛行馬戲團》的狂熱愛好者,我就選擇了用 Python 作爲項目的名字。
《蒙提 · 派森的飛行馬戲團》(Monty Python’s Flying Circus)是 BBC 播出的英國電視喜劇劇集,蒙提 · 派森(Monty Python)是創作該劇的六人喜劇團隊,由此可見,Python 雖原意爲蟒蛇,但吉多 · 範羅蘇姆用它來命名一門開發語言,並非出於他對蟒蛇的喜愛,大家不必恐懼。
Python 2.0 於 2000 年 10 月 16 日發佈。Python 3.0 於 2008 年 12 月 3 日發佈,此版不完全兼容之前的 Python 源代碼。目前 Python 的正式版已經更新到 3.9 版本,且官方不再維護 2.0 版本,因此建議初學者(包括已經在學習的)至少從 3.6 版本開始學習 Python,之後的版本功能差異不會太大。
Pandas 簡介
Pandas 是使用 Python 語言開發的用於數據處理和數據分析的第三方庫。它擅長處理數字型數據和時間序列數據,當然文本型的數據也能輕鬆處理。
作爲 Python 的三方庫,Pandas 是建構在 Python 的基礎上的,它封裝了一些複雜的代碼實現過程,我們只要調用它的方法就能輕鬆實現我們的需求。
Python 中的庫、框架、包意義基本相同,都是別人造好的輪子,我們可以直接使用,以減少重複的邏輯代碼。正是由於有衆多覆蓋各個領域的框架,我們使用起 Python 來才能簡單高效,而不用關注技術實現細節。
Pandas 由 Wes McKinney 於 2008 年開發。McKinney 當時在紐約的一家金融服務機構工作,金融數據分析需要一個健壯和超快速的數據分析工具,於是他就開發出了 Pandas。
Pandas 的命名跟熊貓無關,而是來自計量經濟學中的術語 “面板數據”(Panel data)。面板數據是一種數據集的結構類型,具有橫截面和時間序列兩個維度。不過,我們不必瞭解它,它只是一種靈感、思想來源。Pandas 目前已經更新到 1.2.1 版本。
02
Pandas 的使用人羣
Pandas 對數據的處理是爲數據分析服務的,它所提供的各種數據處理方法、工具是基於數理統計學的,包含了日常應用中的衆多數據分析方法。我們學習它不僅要掌控它的相應技術,還要從它的數據處理思路中學習數據分析的理論和方法。
特別地,如果你想要成爲數據分析師、數據產品經理、數據開發工程師等與數據相關的工作者,學習 Pandas 能讓你深入數據理論和實踐,更好地理解和應用數據。
Pandas 可以輕鬆應對白領們日常工作中的各種表格數據處理需求,還應用在金融、統計、數理研究、物理計算、社會科學、工程等領域。
Pandas 可以實現複雜的處理邏輯,這些往往是 Excel 等工具無法完成的,還可以自動化、批量化,免去我們在處理相同的大量數據時的重複工作。
Pandas 可以實現非常震撼的可視化效果,它對接衆多令人賞心悅目的可視化庫,可以實現動態數據交互效果。
03
Pandas 的基本功能
Pandas 常用的基本功能如下:
-
從 Excel、CSV、網頁、SQL、剪貼板等文件或工具中讀取數據;
-
合併多個文件或者電子表格中的數據,將數據拆分爲獨立文件;
-
數據清洗,如去重、處理缺失值、填充默認值、補全格式、處理極端值等;
-
建立高效的索引;
-
支持大體量數據;
-
按一定業務邏輯插入計算後的列、刪除列;
-
靈活方便的數據查詢、篩選;
-
分組聚合數據,可獨立指定分組後的各字段計算方式;
-
數據的轉置,如行轉列、列轉行變更處理;
-
連接數據庫,直接用 SQL 查詢數據並進行處理;
-
對時序數據進行分組採樣,如按季、按月、按工作小時,也可以自定義週期,如工作日;
-
窗口計算,移動窗口統計、日期移動等;
-
靈活的可視化圖表輸出,支持所有的統計圖形;
-
爲數據表格增加展示樣式,提高數據識別效率。
04
Pandas 快速入門
1、安裝導入
首先安裝 pandas 庫。打開 “終端” 並執行以下命令:
pip install pandas matplotlib
# 如網絡慢,可指定國內源快速下載安裝
pip install pandas matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
安裝完成後,在終端中啓動 Jupyter Notebook,給文件命名,如 pandas-01。在 Jupyter Notebook 中導入 Pandas,按慣例起別名 pd:
# 引入 Pandas庫,按慣例起別名pd
import pandas as pd
這樣,我們就可以使用 pd 調用 Pandas 的所有功能了。
2、準備數據集
數據集(Data set 或 dataset),又稱爲資料集、數據集合或資料集合,是一種由數據組成的集合,可以簡單理解成一個 Excel 表格。在分析處理數據時,我們要先了解數據集。對所持有數據各字段業務意義的理解是分析數據的前提。
介紹下我們後面會經常用的數據集 team.xlsx,可以從網址 https://www.gairuo.com/file/data/dataset/team.xlsx 下載。它的內容見表 1。
表 1 team.xlsx 的部分內容
這是一個學生各季度成績總表(節選),各列說明如下。
-
name:學生的姓名,這列沒有重複值,一個學生一行,即一條數據,共 100 條。
-
team:所在的團隊、班級,這個數據會重複。
-
Q1~Q4:各個季度的成績,可能會有重複值。
3、讀取數據
瞭解了數據集的意義後,我們將數據讀取到 Pandas 裏,變量名用 df(DataFrame 的縮寫,後續會介紹),它是 Pandas 二維數據的基礎結構。
import pandas as pd # 引入Pandas庫,按慣例起別名pd
# 以下兩種效果一樣,如果是網址,它會自動將數據下載到內存
df = pd.read_excel('https://www.gairuo.com/file/data/dataset/team.xlsx')
df = pd.read_excel('team.xlsx') # 文件在notebook文件同一目錄下
# 如果是CSV,使用pd.read_csv(),還支持很多類型的數據讀取
這樣就把數據讀取到變量 df 中,輸入 df 看一下內容,在 Jupyter Notebook 中的執行效果如圖 2 所示。
圖 2 讀取數據的執行效果
其中:
-
自動增加了第一列,是 Pandas 爲數據增加的索引,從 0 開始,程序不知道我們真正的業務索引,往往需要後面重新指定,使它有一定的業務意義;
-
由於數據量大,自動隱藏了中間部分,只顯示前後 5 條;
-
底部顯示了行數和列數。
4、查看數據
讀取完數據後我們來查看一下數據:
df.head() # 查看前5條,括號裏可以寫明你想看的條數
df.tail() # 查看尾部5條
df.sample(5) # 隨機查看5條
查看前 5 條時的結果如圖 3 所示。
圖 3 查看 df 前 5 條數據
5、驗證數據
拿到數據,我們還需要驗證一下數據是否加載正確,數據大小是否正常。下面是一些常用的代碼,可以執行看看效果(一次執行一行):
df.shape # (100, 6) 查看行數和列數
df.info() # 查看索引、數據類型和內存信息
df.describe() # 查看數值型列的彙總統計
df.dtypes # 查看各字段類型
df.axes # 顯示數據行和列名
df.columns # 列名
df.info() 顯示有數據類型、索引情況、行列數、各字段數據類型、內存佔用等:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100 entries, 0 to 99
Data columns (total 6 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 100 non-null object
1 team 100 non-null object
2 Q1 100 non-null int64
3 Q2 100 non-null int64
4 Q3 100 non-null int64
5 Q4 100 non-null int64
dtypes: int64(4), object(2)
memory usage: 4.8+ KB
df.describe() 會計算出各數字字段的總數(count)、平均數(mean)、標準差(std)、最小值(min)、四分位數和最大值(max):
Out:
Q1 Q2 Q3 Q4
count 100.000000 100.000000 100.000000 100.000000
mean 49.200000 52.550000 52.670000 52.780000
std 29.962603 29.845181 26.543677 27.818524
min 1.000000 1.000000 1.000000 2.000000
25% 19.500000 26.750000 29.500000 29.500000
50% 51.500000 49.500000 55.000000 53.000000
75% 74.250000 77.750000 76.250000 75.250000
max 98.000000 99.000000 99.000000 99.000000
6、建立索引
以上數據真正業務意義上的索引是 name 列,所以我們需要使它成爲索引:
df.set_index('name', inplace=True) # 建立索引並生效
其中可選參數 inplace=True 會將指定好索引的數據再賦值給 df 使索引生效,否則索引不會生效。注意,這裏並沒有修改原 Excel,從我們讀取數據後就已經和它沒有關係了,我們處理的是內存中的 df 變量。
將 name 建立索引後,就沒有從 0 開始的數字索引了,如圖 4 所示。
圖 4 將 name 設置爲索引的執行效果
7、數據選取
接下來,我們像 Excel 那樣,對數據做一些篩選操作。
(1)選擇列
選擇列的方法如下:
# 查看指定列
df['Q1']
df.Q1 # 同上,如果列名符合Python變量名要求,可使用
顯示如下內容:
df.Q1
Out:
0 89
1 36
2 57
3 93
4 65
..
95 48
96 21
97 98
98 11
99 21
Name: Q1, Length: 100, dtype: int64
這裏返回的是一個 Series 類型數據,可以理解爲數列,它也是帶索引的。之前建立的索引在這裏發揮出了作用,否則我們的索引是一個數字,無法知道與之對應的是誰的數據。
選擇多列的可以用以下方法:
# 選擇多列
df[['team', 'Q1']] # 只看這兩列,注意括號
df.loc[:, ['team', 'Q1']] # 和上一行效果一樣
df.loc[x, y] 是一個非常強大的數據選擇函數,其中 x 代表行,y 代表列,行和列都支持條件表達式,也支持類似列表那樣的切片(如果要用自然索引,需要用 df.iloc[])。下面的例子中會進行演示。
(2)選擇行
選擇行的方法如下:
# 用指定索引選取
df[df.index == 'Liver'] # 指定姓名
# 用自然索引選擇,類似列表的切片
df[0:3] # 取前三行
df[0:10:2] # 在前10箇中每兩個取一個
df.iloc[:10,:] # 前10個
(3)指定行和列
同時給定行和列的顯示範圍:
df.loc['Ben', 'Q1':'Q4'] # 只看Ben的四個季度成績
df.loc['Eorge':'Alexander', 'team':'Q4'] # 指定行區間
(4)條件選擇
按一定的條件顯示數據:
# 單一條件
df[df.Q1 > 90] # Q1列大於90的
df[df.team == 'C'] # team列爲'C'的
df[df.index == 'Oscar'] # 指定索引即原數據中的name
# 組合條件
df[(df['Q1'] > 90) & (df['team'] == 'C')] # and關係
df[df['team'] == 'C'].loc[df.Q1>90] # 多重篩選
8、排序
Pandas 的排序非常方便,示例如下:
df.sort_values(by='Q1') # 按Q1列數據升序排列
df.sort_values(by='Q1', ascending=False) # 降序
df.sort_values(['team', 'Q1'], ascending=[True, False]) # team升序,Q1降序
9、分組聚合
我們可以實現類似 SQL 的 groupby 那樣的數據透視功能:
df.groupby('team').sum() # 按團隊分組對應列相加
df.groupby('team').mean() # 按團隊分組對應列求平均
# 不同列不同的計算方法
df.groupby('team').agg({'Q1': sum, # 總和
'Q2': 'count', # 總數
'Q3':'mean', # 平均
'Q4': max}) # 最大值
統一聚合執行後的效果如圖 5 所示。
圖 5 按 team 分組後求平均數
不同計算方法聚合執行後的效果如圖 6 所示。
圖 6 分組後每列用不同的方法聚合計算
10、數據轉換
對數據表進行轉置,對類似圖 6 中的數據以 A-Q1、E-Q4 兩點連成的折線爲軸對數據進行翻轉,效果如圖 7 所示,不過我們這裏僅用 sum 聚合。
df.groupby('team').sum().T
圖 7 對聚合後的數據進行翻轉
也可以試試以下代碼,看有什麼效果:
df.groupby('team').sum().stack()
df.groupby('team').sum().unstack()
11、增加列
用 Pandas 增加一列非常方便,就與新定義一個字典的鍵值一樣。
df['one'] = 1 # 增加一個固定值的列
df['total'] = df.Q1 + df.Q2 + df.Q3 + df.Q4 # 增加總成績列
# 將計算得來的結果賦值給新列
df['total'] = df.loc[:,'Q1':'Q4'].apply(lambda x:sum(x), axis=1)
df['total'] = df.sum(axis=1) # 可以把所有爲數字的列相加
df['avg'] = df.total/4 # 增加平均成績列
12、統計分析
根據你的數據分析目標,試着使用以下函數,看看能得到什麼結論。
df.mean() # 返回所有列的均值
df.mean(1) # 返回所有行的均值,下同
df.corr() # 返回列與列之間的相關係數
df.count() # 返回每一列中的非空值的個數
df.max() # 返回每一列的最大值
df.min() # 返回每一列的最小值
df.median() # 返回每一列的中位數
df.std() # 返回每一列的標準差
df.var() # 方差
s.mode() # 衆數
13、繪圖
Pandas 利用 plot() 調用 Matplotlib 快速繪製出數據可視化圖形。注意,第一次使用 plot() 時可能需要執行兩次才能顯示圖形。如圖 8 所示,可以使用 plot() 快速繪製折線圖。
df['Q1'].plot() # Q1成績的折線分佈
圖 8 利用 plot() 快速繪製折線圖
如圖 9 所示,可以先選擇要展示的數據,再繪圖。
df.loc['Ben','Q1':'Q4'].plot() # ben四個季度的成績變化
圖 9 選擇部分數據繪製折線圖
如圖 10 所示,可以使用 plot.bar 繪製柱狀圖。
df.loc[ 'Ben','Q1':'Q4'].plot.bar() # 柱狀圖
df.loc[ 'Ben','Q1':'Q4'].plot.barh() # 橫向柱狀圖
圖 10 利用 plot.bar 繪製的柱狀圖
如果想繪製橫向柱狀圖,可以將 bar 更換爲 barh,如圖 11 所示。
圖 11 利用 barh 繪製的橫向柱狀圖
對數據聚合計算後,可以繪製成多條折線圖,如圖 12 所示。
# 各Team四個季度總成績趨勢
df.groupby('team').sum().T.plot()
圖 12 多條折線圖
也可以用 pie 繪製餅圖,如圖 13 所示。
# 各組人數對比
df.groupby('team').count().Q1.plot.pie()
圖 13 餅圖的繪製效果
14、導出
可以非常輕鬆地導出 Excel 和 CSV 文件。
df.to_excel('team-done.xlsx') # 導出 Excel文件
df.to_csv('team-done.csv') # 導出 CSV文件
導出的文件位於 notebook 文件的同一目錄下,打開看看。
本文我們瞭解了編程語言 Python 的特點,爲什麼要學 Python,Pandas 庫的功能,快速感受了一下 Pandas 強大的數據處理和數據分析能力。這些是我們進入數據科學領域的基礎。
本文摘編於《深入淺出 Pandas:利用 Python 進行數據處理與分析》,經出版方授權發佈。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/ANRZZW6IaajNre4MyAp0yw