作者:佘亮 數(shù)據(jù)處理是數(shù)據(jù)分析的核心部分,通過爬蟲或者實際生產(chǎn)過程中初步獲取的數(shù)據(jù)通常具有很多的“垃圾數(shù)據(jù)”,比如重復數(shù)據(jù)或者值缺失,不連續(xù)數(shù)據(jù)等等。這時就需要對數(shù)據(jù)首先進行篩選,補全等“清洗”操作。 數(shù)據(jù)處理是數(shù)據(jù)分析的核心部分,通過爬蟲或者實際生產(chǎn)過程中初步獲取的數(shù)據(jù)通常具有很多的“垃圾數(shù)據(jù)”,比如重復數(shù)據(jù)或者值缺失,不連續(xù)數(shù)據(jù)等等。這時就需要對數(shù)據(jù)首先進行篩選,補全等“清洗”操作。除此之外,“清洗”好的數(shù)據(jù)也需要根據(jù)不同的用途來進行轉(zhuǎn)換,以適應分析,預測或者可視化的需求。 數(shù)據(jù)的處理的軟件包有很多,在python中主要應用Pandas來進行處理。Pandas是一個十分成熟的數(shù)據(jù)處理包,熟練掌握可以高效并且方便地將數(shù)據(jù)進行轉(zhuǎn)換和清洗,本節(jié)主要整理了pandas的一些基本技能和實用技巧,為勵志成為數(shù)據(jù)分析師的你鋪路搭橋。 以下是本教程的總體提綱,這篇文章首先對pandas的基本操作進行介紹,其他內(nèi)容敬請期待后續(xù)的文章。另附上我征稿通知的鏈接:數(shù)據(jù)科學 | 『運籌OR帷幄』數(shù)據(jù)分析、可視化、爬蟲系列教程征稿 一 數(shù)據(jù)分析相關(guān)python包介紹
二 數(shù)據(jù)的導入與導出
三 數(shù)據(jù)提取與篩選
四 數(shù)據(jù)清洗處理
五 高性能科學計算和數(shù)據(jù)分析的基礎(chǔ)包Numpy
六 統(tǒng)計分析
Pandas入門 Pandas 是基于 NumPy 的一個開源 Python 庫,它被廣泛用于數(shù)據(jù)分析,以及數(shù)據(jù)清洗和準備等工作。數(shù)據(jù)科學家經(jīng)常和表格形式的數(shù)據(jù)(比如.csv、.tsv、.xlsx)打交道。Pandas可以使用類似SQL的方式非常方便地加載、處理、分析這些表格形式的數(shù)據(jù)。搭配Matplotlib和Seaborn效果更好。 pandas可以滿足以下需求:
下面我們開始今天的學習之旅。 Pandas的安裝與導入 首先,在使用Pandas前,必須安裝Pandas。如果你安裝過Anaconda,就可以執(zhí)行如下命令安裝Pandas: conda install pandas 如果沒有安裝Anaconda,也沒有關(guān)系,可以使用Python的pip命令來安裝: pip install pandas 注意:pandas安裝會用到numpy庫,因此在安裝pandas之前一定要安裝好numpy。 導入:為了簡便,這里使用pd作為pandas的縮寫,因為pandas依賴numpy,所以在使用之前需要安裝和導入numpy import numpy as np import pandas as pd 打印pandas的版本 pd.__version__ 考慮如下的Python字典數(shù)據(jù)和Python列表標簽: data = {'animal': ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'], 'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3], 'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1], 'priority': ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']} labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'] Pandas數(shù)據(jù)結(jié)構(gòu)介紹 Pandas有兩個數(shù)據(jù)結(jié)構(gòu):Series和DataFrame。
pd.DataFrame:創(chuàng)建pandas矩陣 pd.Series 創(chuàng)建pandas列表 1.從具有索引標簽的字典數(shù)據(jù)創(chuàng)建一個DataFrame df. df = pd.DataFrame(data,index = labels) 返回DataFrame的前三行 df.iloc[:3] df.head(3) 運行結(jié)果如下: 2.從numpy 數(shù)組構(gòu)造DataFrame df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),columns=['a', 'b', 'c']) df2 運行結(jié)果如下 3.通過其他DataFrame來創(chuàng)建DataFrame df3 df3 = df2[['a','b','c']].copy() df3 運行結(jié)果如下: 4.從csv文件中每隔n行來創(chuàng)建Dataframe df = pd.read_csv('https://raw./selva86/datasets/master/BostonHousing.csv', chunksize=50) df2 = pd.DataFrame() 5.用Series創(chuàng)建DataFrame s_1 = pd.Series(data['animal']) s_2 = pd.Series(data['age']) s_3 = pd.Series(data['visits']) s_4 = pd.Series(data['priority']) pd_2 = pd.DataFrame([s_1,s_2,s_3,s_4]) pd_2 運行結(jié)果如下: Pandas處理NaN值 dropna(axis=, how=):丟棄NaN數(shù)據(jù),{axis:0(按行丟棄),1(按列丟棄)} {how:'any'(只要含有NaN數(shù)據(jù)就丟棄),'all'(所有數(shù)據(jù)都為NaN時丟棄)} fillna(value=):將NaN值都設置為value的值 isnull():對每各元素進行判斷是否是NaN,返回結(jié)果矩陣 np.any(matrix) == value:判斷matrix矩陣中是否有value值 np.all(matrix) == value:判斷matrix矩陣中是否所有元素都是value值 Pandas讀取數(shù)據(jù)、導出數(shù)據(jù) 根據(jù)數(shù)據(jù)的格式,pandas提供了多種數(shù)據(jù)讀取和導出的方法,如: 讀取數(shù)據(jù):read_csv、read_table、read_fwf、read_clipboard、read_excel、read_hdf 導出數(shù)據(jù):to_csv、to_table、to_fwf、to_clipboard、to_excel、to_hdf df = pd.read_csv('Q1.csv') print(df) df.to_csv('Q1_pandas.csv') Pandas合并數(shù)據(jù) concat方法是拼接函數(shù),有行拼接和列拼接,默認是行拼接,拼接方法默認是外拼接(并集),拼接對象是pandas數(shù)據(jù)類型。 第一個參數(shù):需要合并的矩陣 axis:合并維度,0:按行合并,1:按列合并 join:處理非公有 列/行 的方式,inner:去除非公有的 列/行,outer:對非公有的 列/行 進行NaN值填充然后合并 ignore_index:是否重排行索引 df1 = pd.DataFrame(np.arange(12).reshape(3, 4), columns=['A', 'B', 'C', 'D'], index=[0, 1, 2]) df2 = pd.DataFrame(np.ones((3, 4)), columns=['B', 'C', 'D', 'E'], index=[1, 2, 3]) print(pd.concat([df1, df2], join='outer', ignore_index=True)) # join = {'outer', 'inner'} print(pd.concat([df1, df2], axis=1, join_axes=[df1.index])) print(df1.append([df2], ignore_index=True)) append方法在index方向連接兩個DataFrame或者對DataFrame進行擴展 append 方法可以直接用list對DataFrame進行擴展。 df = pd.DataFrame([[1, 2], [3, 4]]) df = df.append([[1,2]]) print(df) 運行結(jié)果: 或者也可以將兩個DataFrame連接起來。 df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB')) df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB')) df = df.append(df2) print(df) 運行結(jié)果: 需要注意的是,append方法并不能像list的append方法一樣對原來的df繼續(xù)修改,而是建立了一個新的對象。如果要修改df,那么需要重新對df賦值,所以append的方法執(zhí)行效率并不是很高。 Join方法 是基于Index連接DataFrame,連接方法有內(nèi)連接、外連接(左連接和右連接) caller = pd.DataFrame({'key':['A0','A1','A2','A3','A4','A5'],'B':['B0','B1','B2','B3','B4','B5']}) other = pd.DataFrame({'key':['A0','A1','A2'],'C':['C0','C1','C2']}) caller.join(other,lsuffix='_caller',rsuffix='_other',how='inner') 運行結(jié)果如下: 另外,還有一種merge方法與Join方法類似,不過語法略有不同。 通過on連接兩個數(shù)據(jù)集的相同列,how表示連接的方式也有內(nèi)連接、外連接(左連接和右連接) 使用merge方式要求合并的兩個DataFrame需要有兩數(shù)據(jù)集有一個相同列(不要求數(shù)值完全相同),繼續(xù)以上面數(shù)據(jù)為例,對比下區(qū)別 df = pd.merge(caller,other,on = ['key'],how = 'inner') 運行結(jié)果如下: |
|