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]})
使用merge函數對兩個資料表進行合并,合并的方式為inner,将兩個資料表中共有的資料比對到一起生成新的資料表。并命名為df_inner。
#資料表比對合并,inner模式
df_inner=pd.merge(df,df1,how='inner')
除了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中需要使用ort_values函數和sort_index函數完成排序。
在python中,既可以按索引對資料表進行排序,也可以看制定列的數值進行排序。首先我們按age列中使用者的年齡對資料表進行排序。
使用的函數為sort_values。
#按特定列的值排序
df_inner.sort_values(by=['age'])
sort_index函數用來将資料表按索引列的值進行排序。
#按索引列排序
df_inner.sort_index()
資料分組
excel中可以通過vlookup函數進行近似比對來完成對數值的分組,或者使用“資料透視表”來完成分組。相應的 python中使用where函數完成資料分組。
where函數用來對資料進行判斷和分組,下面的代碼中我們對price列的值進行判斷,将符合條件的分為一組,不符合條件的分為另一組,并使用group字段進行标記。
#如果price列的值>3000,group列顯示high,否則顯示low
df_inner['group'] = np.where(df_inner['price'] > 3000,'high','low')
除了where函數以外,還可以對多個字段的值進行判斷後對資料進行分組,下面的代碼中對city列等于beijing并且price列大于等于4000的資料标記為1。
#對複合多個條件的資料進行分組标記
df_inner.loc[(df_inner['city'] == 'beijing') & (df_inner['price'] >= 4000), 'sign']=1
資料分列
與資料分組相反的是對數值進行分列,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'])
#将完成分列後的資料表與原df_inner資料表進行比對
df_inner=pd.merge(df_inner,split,right_index=true, left_index=true)
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]
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]
iloc函數除了可以按區域提取資料,還可以按位置逐條提取,前面方括号中的0,2,5表示資料所在行的位置,後面方括号中的數表示所在列的位置。
按标簽和位置提取(ix)
ix是loc和iloc的混合,既能按索引标簽提取,也能按位置進行資料提取。下面代碼中行的位置按索引日期設定,列按位置設定。
#使用ix按索引标簽和位置混合提取資料
df_inner.ix[:'2013-01-03',:4]
按條件提取(區域和條件值)
除了按标簽和位置提起資料以外,還可以按具體的條件進行資料。下面使用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])
3.資料篩選
第六部分為資料篩選,使用與,或,非三個條件配合大于,小于和等于對資料進行篩選,并進行計數和求和。與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
本文作者:佚名
來源:51cto