文章來源於公衆號:數倉寶貝庫程序員
導讀:Pandas是Python數據分析的利器,也是各類數據建模的標準工具。本文帶你們入門Pandas,將介紹Python語言、Python數據生態和Pandas的一些基本功能。數據庫
在Python語言應用生態中,數據科學領域近年來十分熱門。做爲數據科學中一個很是基礎的庫,Pandas受到了普遍關注。Pandas能夠將現實中來源多樣的數據進行靈活處理和分析。編程
01網絡
Pandas是什麼數據結構
不少初學者可能有這樣一個疑問:「我想學的是Python數據分析,爲何常常會被引導到Pandas上去?」雖然這兩個東西都是以P開頭的,但它們並非同一個層面的東西。簡單來講,Pandas是Python這門編程語言中一個專門用來作數據分析的工具,它們的關係如圖1所示。接下來咱們就說說Python是什麼,Pandas又是什麼。app
圖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快速入門
一、安裝導入
首先安裝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的全部功能了。
二、準備數據集
數據集(Data set或dataset),又稱爲資料集、數據集合或資料集合,是一種由數據組成的集合,能夠簡單理解成一個Excel表格。在分析處理數據時,咱們要先了解數據集。對所持有數據各字段業務意義的理解是分析數據的前提。
介紹下咱們後面會常常用的數據集team.xlsx,能夠從網址 https://www.gairuo.com/file/data/dataset/team.xlsx下載。它的內容見表1。
表1 team.xlsx的部份內容
這是一個學生各季度成績總表(節選),各列說明以下。
-
name:學生的姓名,這列沒有重複值,一個學生一行,即一條數據,共100條。
-
team:所在的團隊、班級,這個數據會重複。
-
Q1~Q4:各個季度的成績,可能會有重複值。
三、讀取數據
瞭解了數據集的意義後,咱們將數據讀取到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條;
-
底部顯示了行數和列數。
四、查看數據
讀取完數據後咱們來查看一下數據:
df.head() # 查看前5條,括號裏能夠寫明你想看的條數 df.tail() # 查看尾部5條 df.sample(5) # 隨機查看5條
查看前5條時的結果如圖3所示。
圖3 查看df前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
六、創建索引
以上數據真正業務意義上的索引是name列,因此咱們須要使它成爲索引:
df.set_index('name', inplace=True) # 創建索引並生效
其中可選參數inplace=True會將指定好索引的數據再賦值給df使索引生效,不然索引不會生效。注意,這裏並無修改原Excel,從咱們讀取數據後就已經和它沒有關係了,咱們處理的是內存中的df變量。
將name創建索引後,就沒有從0開始的數字索引了,如圖4所示。
圖4 將name設置爲索引的執行效果
七、數據選取
接下來,咱們像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] # 多重篩選
八、排序
Pandas的排序很是方便,示例以下:
df.sort_values(by='Q1') # 按Q1列數據升序排列 df.sort_values(by='Q1', ascending=False) # 降序 df.sort_values(['team', 'Q1'], ascending=[True, False]) # team升序,Q1降序
九、分組聚合
咱們能夠實現相似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 分組後每列用不一樣的方法聚合計算
十、數據轉換
對數據表進行轉置,對相似圖6中的數據以A-Q一、E-Q4兩點連成的折線爲軸對數據進行翻轉,效果如圖7所示,不過咱們這裏僅用sum聚合。
df.groupby('team').sum().T
圖7 對聚合後的數據進行翻轉
也能夠試試如下代碼,看有什麼效果:
df.groupby('team').sum().stack() df.groupby('team').sum().unstack()
十一、增長列
用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 # 增長平均成績列
十二、統計分析
根據你的數據分析目標,試着使用如下函數,看看能獲得什麼結論。
df.mean() # 返回全部列的均值 df.mean(1) # 返回全部行的均值,下同 df.corr() # 返回列與列之間的相關係數 df.count() # 返回每一列中的非空值的個數 df.max() # 返回每一列的最大值 df.min() # 返回每一列的最小值 df.median() # 返回每一列的中位數 df.std() # 返回每一列的標準差 df.var() # 方差 s.mode() # 衆數
1三、繪圖
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 餅圖的繪製效果
1四、導出
能夠很是輕鬆地導出Excel和CSV文件。
df.to_excel('team-done.xlsx') # 導出 Excel文件 df.to_csv('team-done.csv') # 導出 CSV文件
導出的文件位於notebook文件的同一目錄下,打開看看。
本文咱們瞭解了編程語言Python的特色,爲何要學Python,Pandas庫的功能,快速感覺了一下Pandas強大的數據處理和數據分析能力。這些是咱們進入數據科學領域的基礎。
本文摘編於《深刻淺出Pandas:利用Python進行數據處理與分析》,經出版方受權發佈。
做者:李慶輝 數據產品專家,某電商公司數據產品團隊負責人,擅長經過數據治理、數據分析、數據化運營提高公司的數據應用水平。