像Excel同樣使用python進行數據分析(1)html

像Excel同樣使用python進行數據分析(3)python

摘要:本篇文章經過python與excel的功能對比介紹如何使用python經過函數式編程完成excel中的數據處理及分析工做。編程

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


4,數據預處理

第四部分是數據的預處理,對清洗完的數據進行整理以便後期的統計和分析工做。主要包括數據表的合併,排序,數值分列,數據分組及標記等工做。函數

數據表合併

首先是對不一樣的數據表進行合併,咱們這裏建立一個新的數據表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函數對兩個數據表進行合併(關於三個合併函數:merge,,concat,join的用法與區別見連接:https://www.cnblogs.com/bawu/p/7701810.html),合併的方式爲inner,將兩個數據表中共有的數據匹配到一塊兒生成新的數據表。並命名爲df_inner。post

#數據表匹配合並,inner模式
df_inner=pd.merge(df,df1,how='inner')

 

像Excel同樣使用python進行數據分析(2)-數據分析網

除了inner方式之外,合併的方式還有left,right和outer方式。這幾種方式的差異在我其餘的文章中有詳細的說明和對比。spa

#其餘數據表匹配模式
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。excel

#設置索引列
df_inner.set_index('id')

 

像Excel同樣使用python進行數據分析(2)-數據分析網

排序(按索引,按數值)

Excel中能夠經過數據目錄下的排序按鈕直接對數據表進行排序,比較簡單。Python中須要使用ort_values函數和sort_index函數完成排序。code

在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函數實現分列。
在數據表中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)

 

5,數據提取

第五部分是數據提取,也是數據分析中最多見的一個工做。這部分主要使用三個函數,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]

 

 

Reset_index函數用於恢復索引,這裏咱們從新將date字段的日期設置爲數據表的索引,並按日期進行數據提取。

#重設索引
df_inner.reset_index()
  #設置日期爲索引
 df_inner = df_inner.set_index( 'date' )

 

使用冒號限定提取數據的範圍,冒號前面爲空表示從0開始。提取全部2013年1月4日之前的數據。

#提取4日以前的全部數據
df_inner[:'2013-01-04']

 



按位置提取(iloc)

使用iloc函數按位置對數據表中的數據進行提取,這裏冒號先後的數字再也不是索引的標籤名稱,而是數據所在的位置,從0開始。

#使用iloc按位置區域提取數據
df_inner.iloc[:3,:2]

 

像Excel同樣使用python進行數據分析(2)-數據分析網

iloc函數除了能夠按區域提取數據,還能夠按位置逐條提取,前面方括號中的0,2,5表示數據所在行的位置,後面方括號中的數表示所在列的位置。

#使用iloc按位置單獨提取數據
df_inner.iloc[[0,2,5],[4,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'])]

 

數值提取還能夠完成相似數據分列的工做,從合併的數值中提取出制定的數值。

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)-數據分析網
6,數據篩選

第六部分爲數據篩選,使用與,或,非三個條件配合大於,小於和等於對數據進行篩選,並進行計數和求和。與excel中的篩選功能和countifs和sumifs功能類似。

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

Excel數據目錄下提供了「篩選」功能,用於對數據表按不一樣的條件進行篩選。Python中使用loc函數配合篩選條件來完成篩選功能。配合sum和count函數還能實現excel中sumif和countif函數的功能。
使用「與」條件進行篩選,條件是年齡大於25歲,而且城市爲beijing。篩選後只有一條數據符合要求。

#使用「與」條件進行篩選
df_inner.loc[(df_inner['age'] > 25) & (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']]

 

使用「或」條件進行篩選,年齡大於25歲或城市爲beijing。篩選後有6條數據符合要求。

#使用「或」條件篩選
df_inner.loc[(df_inner['age'] > 25) | (df_inner['city'] == 'beijing'), ['id','city','age','category','gender']].sort (['age'])

 

在前面的代碼後增長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'])

 

在前面的代碼後面增長city列,並使用count函數進行計數。至關於excel中的countifs函數的功能。

#對篩選後的數據按city列進行計數
df_inner.loc[(df_inner['city'] != 'beijing'), ['id','city','age','category','gender']].sort(['id']).city.count() 4

 

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

#使用query函數進行篩選
df_inner.query('city == ["beijing", "shanghai"]')

 

在前面的代碼後增長price字段和sum函數。對篩選後的price字段進行求和,至關於excel中的sumifs函數的功能。

#對篩選後的結果按price進行求和
df_inner.query('city == ["beijing", "shanghai"]').price.sum() 12230

 

下一篇文章,也就是本系列的最後一篇咱們將介紹7-9最後三部分的內容,分別爲數據彙總,數據統計和數據輸出。請朋友們繼續關注 。