天天看點

像Excel一樣使用python進行資料分析-(2)

excel是資料分析中最常用的工具,本篇文章通過python與excel的功能對比介紹如何使用python通過函數式程式設計完成excel中的資料處理及分析工作。在python中pandas庫用于資料處理,我們從1787頁的pandas官網文檔中總結出最常用的36個函數,通過這些函數介紹如何通過python完成資料生成和導入,資料清洗,預處理,以及最常見的資料分類,資料篩選,分類彙總,透視等最常見的操作。

1.資料預處理

這部分是資料的預處理,對清洗完的資料進行整理以便後期的統計和分析工作。主要包括資料表的合并,排序,數值分列,資料分組及标記等工作。

資料表合并

首先是對不同的資料表進行合并,我們這裡建立一個新的資料表df1,并将df和df1兩個資料表進行合并。在excel中沒有直接完成資料表合并的功能,可以通過vlookup函數分步實作。在python中可以通過merge函數一次性實作。下面建立df1資料表,用于和df資料表進行合并。

#建立df1資料表 

df1=pd.dataframe({"id":[1001,1002,1003,1004,1005,1006,1007,1008], 

"gender":['male','female','male','female','male','female','male','female'], 

"pay":['y','n','y','y','n','y','n','y',], 

"m-point":[10,12,20,40,40,40,30,20]}) 

像Excel一樣使用python進行資料分析-(2)

使用merge函數對兩個資料表進行合并,合并的方式為inner,将兩個資料表中共有的資料比對到一起生成新的資料表。并命名為df_inner。

#資料表比對合并,inner模式 

df_inner=pd.merge(df,df1,how='inner') 

像Excel一樣使用python進行資料分析-(2)

除了inner方式以外,合并的方式還有left,right和outer方式。這幾種方式的差别在我其他的文章中有詳細的說明和對比。

#其他資料表比對模式 

df_left=pd.merge(df,df1,how='left') 

df_right=pd.merge(df,df1,how='right') 

df_outer=pd.merge(df,df1,how='outer') 

設定索引列

完成資料表的合并後,我們對df_inner資料表設定索引列,索引列的功能很多,可以進行資料提取,彙總,也可以進行資料篩選等。

設定索引的函數為set_index。

#設定索引列 

df_inner.set_index('id') 

像Excel一樣使用python進行資料分析-(2)

排序(按索引,按數值)

excel中可以通過資料目錄下的排序按鈕直接對資料表進行排序,比較簡單。python中需要使用ort_values函數和sort_index函數完成排序。

像Excel一樣使用python進行資料分析-(2)

在python中,既可以按索引對資料表進行排序,也可以看制定列的數值進行排序。首先我們按age列中使用者的年齡對資料表進行排序。

使用的函數為sort_values。

#按特定列的值排序 

df_inner.sort_values(by=['age']) 

像Excel一樣使用python進行資料分析-(2)

sort_index函數用來将資料表按索引列的值進行排序。

#按索引列排序 

df_inner.sort_index() 

像Excel一樣使用python進行資料分析-(2)

資料分組

excel中可以通過vlookup函數進行近似比對來完成對數值的分組,或者使用“資料透視表”來完成分組。相應的 python中使用where函數完成資料分組。

where函數用來對資料進行判斷和分組,下面的代碼中我們對price列的值進行判斷,将符合條件的分為一組,不符合條件的分為另一組,并使用group字段進行标記。

#如果price列的值>3000,group列顯示high,否則顯示low 

df_inner['group'] = np.where(df_inner['price'] > 3000,'high','low') 

像Excel一樣使用python進行資料分析-(2)

除了where函數以外,還可以對多個字段的值進行判斷後對資料進行分組,下面的代碼中對city列等于beijing并且price列大于等于4000的資料标記為1。

#對複合多個條件的資料進行分組标記 

df_inner.loc[(df_inner['city'] == 'beijing') & (df_inner['price'] >= 4000), 'sign']=1 

像Excel一樣使用python進行資料分析-(2)

資料分列

與資料分組相反的是對數值進行分列,excel中的資料目錄下提供“分列”功能。在python中使用split函數實作分列。

像Excel一樣使用python進行資料分析-(2)

在資料表中category列中的資料包含有兩個資訊,前面的數字為類别id,後面的字母為size值。中間以連字元進行連接配接。我們使用split函數對這個字段進行拆分,并将拆分後的資料表比對回原資料表中。

#對category字段的值依次進行分列,并建立資料表,索引值為df_inner的索引列,列名稱為category和size 

pd.dataframe((x.split('-') for x in df_inner['category']),index=df_inner.index,columns=['category','size']) 

像Excel一樣使用python進行資料分析-(2)

#将完成分列後的資料表與原df_inner資料表進行比對 

df_inner=pd.merge(df_inner,split,right_index=true, left_index=true) 

像Excel一樣使用python進行資料分析-(2)

2.資料提取

第五部分是資料提取,也是資料分析中最常見的一個工作。這部分主要使用三個函數,loc,iloc和ix,loc函數按标簽值進行提取,iloc按位置進行提取,ix可以同時按标簽和位置進行提取。下面介紹每一種函數的使用方法。

按标簽提取(loc)

loc函數按資料表的索引标簽進行提取,下面的代碼中提取了索引列為3的單條資料。

#按索引提取單行的數值 

df_inner.loc[3] 

id 1004 

date 2013-01-05 00:00:00 

city shenzhen 

category 110-c 

age 32 

price 5433 

gender female 

m-point 40 

pay y 

group high 

sign nan 

category_1 110 

size c 

name: 3, dtype: object 

使用冒号可以限定提取資料的範圍,冒号前面為開始的标簽值,後面為結束的标簽值。下面提取了0到5的資料行。

#按索引提取區域行數值 

df_inner.loc[0:5] 

像Excel一樣使用python進行資料分析-(2)

reset_index函數用于恢複索引,這裡我們重新将date字段的日期設定為資料表的索引,并按日期進行資料提取。

#重設索引 

df_inner.reset_index() 

像Excel一樣使用python進行資料分析-(2)

#設定日期為索引 

df_inner=df_inner.set_index('date') 

像Excel一樣使用python進行資料分析-(2)

使用冒号限定提取資料的範圍,冒号前面為空表示從0開始。提取所有2013年1月4日以前的資料。

#提取4日之前的所有資料 

df_inner[:'2013-01-04'] 

像Excel一樣使用python進行資料分析-(2)

按位置提取(iloc)

使用iloc函數按位置對資料表中的資料進行提取,這裡冒号前後的數字不再是索引的标簽名稱,而是資料所在的位置,從0開始。

#使用iloc按位置區域提取資料 

df_inner.iloc[:3,:2] 

像Excel一樣使用python進行資料分析-(2)

iloc函數除了可以按區域提取資料,還可以按位置逐條提取,前面方括号中的0,2,5表示資料所在行的位置,後面方括号中的數表示所在列的位置。

像Excel一樣使用python進行資料分析-(2)

按标簽和位置提取(ix)

ix是loc和iloc的混合,既能按索引标簽提取,也能按位置進行資料提取。下面代碼中行的位置按索引日期設定,列按位置設定。

#使用ix按索引标簽和位置混合提取資料 

df_inner.ix[:'2013-01-03',:4] 

像Excel一樣使用python進行資料分析-(2)

按條件提取(區域和條件值)

除了按标簽和位置提起資料以外,還可以按具體的條件進行資料。下面使用loc和isin兩個函數配合使用,按指定條件對資料進行提取 。

使用isin函數對city中的值是否為beijing進行判斷。

#判斷city列的值是否為beijing 

df_inner['city'].isin(['beijing']) 

date 

2013-01-02 true 

2013-01-05 false 

2013-01-07 true 

2013-01-06 false 

2013-01-03 false 

2013-01-04 false 

name: city, dtype: bool 

将isin函數嵌套到loc的資料提取函數中,将判斷結果為ture資料提取出來。這裡我們把判斷條件改為city值是否為beijing和 shanghai。如果是就把這條資料提取出來。

#先判斷city列裡是否包含beijing和shanghai,然後将複合條件的資料提取出來。 

df_inner.loc[df_inner['city'].isin(['beijing','shanghai'])] 

像Excel一樣使用python進行資料分析-(2)

數值提取還可以完成類似資料分列的工作,從合并的數值中提取出制定的數值。

category=df_inner['category'] 

0 100-a 

3 110-c 

5 130-f 

4 210-a 

1 100-b 

2 110-a 

name: category, dtype: object 

#提取前三個字元,并生成資料表 

pd.dataframe(category.str[:3]) 

像Excel一樣使用python進行資料分析-(2)

3.資料篩選

第六部分為資料篩選,使用與,或,非三個條件配合大于,小于和等于對資料進行篩選,并進行計數和求和。與excel中的篩選功能和countifs和sumifs功能相似。

按條件篩選(與,或,非)

excel資料目錄下提供了“篩選”功能,用于對資料表按不同的條件進行篩選。python中使用loc函數配合篩選條件來完成篩選功能。配合sum和count函數還能實作excel中sumif和countif函數的功能。

像Excel一樣使用python進行資料分析-(2)

使用“與”條件進行篩選,條件是年齡大于25歲,并且城市為beijing。篩選後隻有一條資料符合要求。

#使用“與”條件進行篩選  

df_inner.loc[(df_inner['age'] > 25) & (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']] 

像Excel一樣使用python進行資料分析-(2)

使用“或”條件進行篩選,年齡大于25歲或城市為beijing。篩選後有6條資料符合要求。

#使用“或”條件篩選 

df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']].sort 

(['age']) 

像Excel一樣使用python進行資料分析-(2)

在前面的代碼後增加price字段以及sum函數,按篩選後的結果将price字段值進行求和,相當于excel中sumifs的功能。

#對篩選後的資料按price字段進行求和 

df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] == 'beijing'), 

['id','city','age','category','gender','price']].sort(['age']).price.sum()  

19796 

使用“非”條件進行篩選,城市不等于beijing。符合條件的資料有4條。将篩選結果按id列進行排序。

#使用“非”條件進行篩選  

df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id']) 

像Excel一樣使用python進行資料分析-(2)

在前面的代碼後面增加city列,并使用count函數進行計數。相當于excel中的countifs函數的功能。

#對篩選後的資料按city列進行計數 

df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id']).city.count() 

還有一種篩選的方式是用query函數。下面是具體的代碼和篩選結果。

#使用query函數進行篩選 

df_inner.query('city == ["beijing", "shanghai"]') 

像Excel一樣使用python進行資料分析-(2)

在前面的代碼後增加price字段和sum函數。對篩選後的price字段進行求和,相當于excel中的sumifs函數的功能。

#對篩選後的結果按price進行求和  

df_inner.query('city == ["beijing", "shanghai"]').price.sum()  

12230 

本文作者:佚名

來源:51cto