現(xiàn)在很多行業(yè),都離不開(kāi)Excel:
做財(cái)務(wù)的,要用Excel做報(bào)表;
做物流的,會(huì)用Excel來(lái)跟蹤訂單情況;
做HR的,會(huì)用Excel算工資;
做運(yùn)營(yíng)的,會(huì)用Excel記錄數(shù)據(jù)做分析。
不知道你有沒(méi)有這樣的經(jīng)歷,每次你用Excel做數(shù)據(jù)分析時(shí),往往都要生成好多張工作簿,做中間計(jì)算的時(shí)候,鼠標(biāo)要一路移到最后一頁(yè),才出現(xiàn)最終結(jié)果。
如果其中某個(gè)數(shù)據(jù)出了些問(wèn)題,你可能要從頭開(kāi)始,排查錯(cuò)誤,很容易看花眼,錯(cuò)上加錯(cuò)。
為了避免這種情況,很多人開(kāi)始學(xué)Excel的高級(jí)技能 - VBA。
但其實(shí),VBA并不容易學(xué),而且在數(shù)據(jù)量大的情況下,VBA運(yùn)行很耗時(shí)。
那么我們應(yīng)該怎么解決呢?用Python呀!
相比VBA,Python非常容易入門(mén),而且用途廣泛。別人用Excel花2天做的事情,Python1ge 小時(shí)就能搞定。
下面就用幾個(gè)常見(jiàn)的操作帶你感受一下:
數(shù)據(jù)讀取、生成、存儲(chǔ)
Excel讀取本地?cái)?shù)據(jù)需要打開(kāi)目標(biāo)文件夾選中該文件并打開(kāi)
Pandas支持讀取本地Excel、txt文件,也支持從網(wǎng)頁(yè)直接讀取表格數(shù)據(jù),只用一行代碼即可,
例如讀取上述本地Excel數(shù)據(jù)可以使用pd.read_excel('示例數(shù)據(jù).xlsx')
以生成10*2的0—1均勻分布隨機(jī)數(shù)矩陣為例,在Excel中需要使用rand()函數(shù)生成隨機(jī)數(shù),并手動(dòng)拉取指定范圍
在Pandas中可以結(jié)合NumPy生成由指定隨機(jī)數(shù)(均勻分布、正態(tài)分布等)生成的矩陣,例如同樣生成10*2的0—1均勻分布隨機(jī)數(shù)矩陣為,使用一行代碼即可:pd.DataFrame(np.random.rand(10,2))
在Excel中需要點(diǎn)擊保存并設(shè)置格式/文件名
在Pandas中可以使用
pd.to_excel('filename.xlsx')來(lái)將當(dāng)前工作表格保存至當(dāng)前目錄下,當(dāng)然也可以使用to_csv保存為csv等其他格式,也可以使用絕對(duì)路徑來(lái)指定保存位置
篩選、排序、去重?cái)?shù)據(jù)
使用我們之前的示例數(shù)據(jù),在Excel中篩選出薪資大于5000的數(shù)據(jù)步驟如下
在Pandas中,可直接對(duì)數(shù)據(jù)框進(jìn)行條件篩選,例如同樣進(jìn)行單個(gè)條件(薪資大于5000)的篩選可以使用df[df['薪資水平']>5000],如果使用多個(gè)條件的篩選只需要使用&(并)與|(或)操作符實(shí)現(xiàn)
在Excel中可以點(diǎn)擊排序按鈕進(jìn)行排序,例如將示例數(shù)據(jù)按照薪資從高到低進(jìn)行排序可以按照下面的步驟進(jìn)行
在pandas中可以使用sort_values進(jìn)行排序,使用ascending來(lái)控制升降序,例如將示例數(shù)據(jù)按照薪資從高到低進(jìn)行排序可以使用df.sort_values('薪資水平',ascending=False,inplace=True)
在Excel中可以通過(guò)點(diǎn)擊數(shù)據(jù)—>刪除重復(fù)值按鈕并選擇需要去重的列即可,例如對(duì)示例數(shù)據(jù)按照創(chuàng)建時(shí)間列進(jìn)行去重,可以發(fā)現(xiàn)去掉了196 個(gè)重復(fù)值,保留了 629 個(gè)唯一值。
在pandas中可以使用drop_duplicates來(lái)對(duì)數(shù)據(jù)進(jìn)行去重,并且可以指定列以及保留順序,例如對(duì)示例數(shù)據(jù)按照創(chuàng)建時(shí)間列進(jìn)行去重df.drop_duplicates(['創(chuàng)建時(shí)間'],inplace=True),可以發(fā)現(xiàn)和Excel處理的結(jié)果一致,保留了 629 個(gè)唯一值。
合并/拆分?jǐn)?shù)據(jù)
在Excel中可以使用公式也可以使用Ctrl+E快捷鍵完成多列合并,以公式為例,合并示例數(shù)據(jù)中的地址+崗位列步驟如下
在Pandas中合并多列比較簡(jiǎn)單,類似于之前的數(shù)據(jù)插入操作,例如合并示例數(shù)據(jù)中的地址+崗位列使用df['合并列'] = df['地址'] + df['崗位']
拆分?jǐn)?shù)據(jù)在Excel中可以通過(guò)點(diǎn)擊數(shù)據(jù)—>分列并按照提示的選項(xiàng)設(shè)置相關(guān)參數(shù)完成分列,但是由于該列含有[]等特殊字符,所以需要先使用查找替換去掉
在Pandas中可以使用.split來(lái)完成分列,但是在分列完畢后需要使用merge來(lái)將分列完的數(shù)據(jù)添加至原DataFrame,對(duì)于分列完的數(shù)據(jù)含有[]字符,我們可以使用正則或者字符串lstrip方法進(jìn)行處理,但因不是pandas特性,此處不再展開(kāi)。
數(shù)據(jù)分組、統(tǒng)計(jì)、計(jì)算
在Excel中對(duì)數(shù)據(jù)進(jìn)行分組計(jì)算需要先對(duì)需要分組的字段進(jìn)行排序,之后可以通過(guò)點(diǎn)擊分類匯總并設(shè)置相關(guān)參數(shù)完成,比如對(duì)示例數(shù)據(jù)的學(xué)歷進(jìn)行分組并求不同學(xué)歷的平均薪資
在Pandas中對(duì)數(shù)據(jù)進(jìn)行分組計(jì)算可以使用groupby輕松搞定,比如使用df.groupby('學(xué)歷').mean()一行代碼即可對(duì)示例數(shù)據(jù)的學(xué)歷進(jìn)行分組并求不同學(xué)歷的平均薪資,結(jié)果與Excel一致
在Excel中有很多統(tǒng)計(jì)相關(guān)的公式,也有現(xiàn)成的分析工具,比如對(duì)薪資水平列進(jìn)行描述性統(tǒng)計(jì)分析,可以通過(guò)添加工具庫(kù)之后點(diǎn)擊數(shù)據(jù)分析按鈕并設(shè)置相關(guān)參數(shù)
在pandas中也有現(xiàn)成的函數(shù)describe快速完成對(duì)數(shù)據(jù)的描述性統(tǒng)計(jì),比如使用df['薪資水平'].describe()即可得到薪資列的描述性統(tǒng)計(jì)結(jié)果
在Excel中有很多計(jì)算相關(guān)的公式,比如可以使用COUNTIFS來(lái)統(tǒng)計(jì)薪資大于10000的崗位數(shù)量有518個(gè)
在Pandas中可以直接使用類似數(shù)據(jù)篩選的方法來(lái)統(tǒng)計(jì)薪資大于10000的崗位數(shù)量len(df[df['薪資水平']>10000])
數(shù)據(jù)可視化
在Excel中可以通過(guò)點(diǎn)擊插入并選擇圖表來(lái)快速完成對(duì)數(shù)據(jù)的可視化,比如制作薪資的直方圖,并且有很多樣式可以直接使用
在Pandas中也支持直接對(duì)數(shù)據(jù)繪制不同可視化圖表,例如直方圖,可以使用plot或者直接使用hist來(lái)制作df['薪資水平'].hist()
也可以做數(shù)據(jù)透視表,在Excel中有現(xiàn)成的工具,只需要選中數(shù)據(jù)—>點(diǎn)擊插入—>數(shù)據(jù)透視表即可生成,并且支持字段的拖取實(shí)現(xiàn)不同的透視表,非常方便,比如制作地址、學(xué)歷、薪資的透視表
在Pandas中制作數(shù)據(jù)透視表可以使用pivot_table函數(shù),例如制作地址、學(xué)歷、薪資的透視表pd.pivot_table(df,index=['地址','學(xué)歷'],values=['薪資水平']),雖然結(jié)果一樣,但是并沒(méi)有Excel一樣方便調(diào)整與多樣
vlookup
vlookup號(hào)稱是Excel里的神器之一,用途很廣泛,你會(huì)幾種?
案例一
問(wèn)題:A3:B7單元格區(qū)域?yàn)樽帜傅燃?jí)查詢表,表示60分以下為E級(jí)、60~69分為D級(jí)、70~79分為C級(jí)、80~89分為B級(jí)、90分以上為A級(jí)。D:G列為初二年級(jí)1班語(yǔ)文測(cè)驗(yàn)成績(jī)表,如何根據(jù)語(yǔ)文成績(jī)返回其字母等級(jí)?
方法:在H3:H13單元格區(qū)域中輸入=VLOOKUP(G3, $A$3:$B$7, 2)
python實(shí)現(xiàn):
df = pd.read_excel('test.xlsx', sheet_name=0)def grade_to_point(x): if x >= 90: return 'A' elif x >= 80: return 'B' elif x >= 70: return 'C' elif x >= 60: return 'D' else: return 'E'?df['等級(jí)'] = df['語(yǔ)文'].apply(grade_to_point)df?Out[]: 學(xué)號(hào) 姓名 性別 語(yǔ)文 等級(jí)0 101 王小麗 女 69 D1 102 王寶勤 男 85 B2 103 楊玉萍 女 49 E3 104 田東會(huì) 女 90 A4 105 陳雪蛟 女 73 C5 106 楊建豐 男 42 E6 107 黎梅佳 女 79 C7 108 張興 男 91 A8 109 馬進(jìn)春 女 48 E9 110 魏改娟 女 100 A10 111 王冰研 女 64 D
案例二
問(wèn)題:在Sheet1里面如何查找折舊明細(xì)表中對(duì)應(yīng)編號(hào)下的月折舊額?(跨表查詢)
方法:在Sheet1里面的C2:C4單元格輸入 =VLOOKUP(A2, 折舊明細(xì)表!A$2:$G$12, 7, 0)
python實(shí)現(xiàn):使用merge將兩個(gè)表按照編號(hào)連接起來(lái)就行
df1 = pd.read_excel('test.xlsx', sheet_name='折舊明細(xì)表')df2 = pd.read_excel('test.xlsx', sheet_name=1) #題目里的sheet1df2.merge(df1[['編號(hào)', '月折舊額']], how='left', on='編號(hào)')Out[]: 編號(hào) 資產(chǎn)名稱 月折舊額0 YT001 電動(dòng)門(mén) 13991 YT005 桑塔納轎車 11472 YT008 打印機(jī) 51
案例三
問(wèn)題:類似于案例二,但此時(shí)需要使用近似查找
方法:在B2:B7區(qū)域中輸入公式=VLOOKUP(A2&'*', 折舊明細(xì)表!$B$2:$G$12, 6, 0)
python實(shí)現(xiàn):這個(gè)比起上一個(gè)要麻煩一些,需要用到一些pandas的使用技巧
df1 = pd.read_excel('test.xlsx', sheet_name='折舊明細(xì)表') df3 = pd.read_excel('test.xlsx', sheet_name=3) #含有資產(chǎn)名稱簡(jiǎn)寫(xiě)的表df3['月折舊額'] = 0for i in range(len(df3['資產(chǎn)名稱'])): df3['月折舊額'][i] = df1[df1['資產(chǎn)名稱'].map(lambda x:df3['資產(chǎn)名稱'][i] in x)]['月折舊額']?df3Out[]: 資產(chǎn)名稱 月折舊額0 電動(dòng) 13991 貨車 24382 惠普 1323 交聯(lián) 101334 桑塔納 11475 春蘭 230
案例四
問(wèn)題:在Excel中錄入數(shù)據(jù)信息時(shí),為了提高工作效率,用戶希望通過(guò)輸入數(shù)據(jù)的關(guān)鍵字后,自動(dòng)顯示該記錄的其余信息,例如,輸入員工工號(hào)自動(dòng)顯示該員工的信命,輸入物料號(hào)就能自動(dòng)顯示該物料的品名、單價(jià)等。
如圖所示為某單位所有員工基本信息的數(shù)據(jù)源表,在“2010年3月員工請(qǐng)假統(tǒng)計(jì)表”工作表中,當(dāng)在A列輸入員工工號(hào)時(shí),如何實(shí)現(xiàn)對(duì)應(yīng)員工的姓名、身份證號(hào)、部門(mén)、職務(wù)、入職日期等信息的自動(dòng)錄入?
方法:使用VLOOKUP+MATCH函數(shù),在“2010年3月員工請(qǐng)假統(tǒng)計(jì)表”工作表中選擇B3:F8單元格區(qū)域,輸入下列公式=IF($A3='','',VLOOKUP($A3,員工基本信息!$A:$H,MATCH(B$2,員工基本信息!$2:$2,0),0)),按下【Ctrl+Enter】組合鍵結(jié)束。
python實(shí)現(xiàn):上面的Excel的方法用得很靈活,但是pandas的想法和操作更簡(jiǎn)單方便些
df4 = pd.read_excel('test.xlsx', sheet_name='員工基本信息表')df5 = pd.read_excel('test.xlsx', sheet_name='請(qǐng)假統(tǒng)計(jì)表')df5.merge(df4[['工號(hào)', '姓名', '部門(mén)', '職務(wù)', '入職日期']], on='工號(hào)')Out[]: 工號(hào) 姓名 部門(mén) 職務(wù) 入職日期0 A0004 龔夢(mèng)娟 后勤 主管 2006-11-201 A0003 趙敏 行政 文員 2007-02-162 A0005 黃凌 研發(fā) 工程師 2009-01-143 A0007 王維 人事 經(jīng)理 2006-07-244 A0016 張君寶 市場(chǎng) 工程師 2007-08-145 A0017 秦羽 人事 副經(jīng)理 2008-03-06
案例五
問(wèn)題:用VLOOKUP函數(shù)實(shí)現(xiàn)批量查找,VLOOKUP函數(shù)一般情況下只能查找一個(gè),那么多項(xiàng)應(yīng)該怎么查找呢?如下圖,如何把張一的消費(fèi)額全部列出?
方法:在C9:C11單元格里面輸入公式
=VLOOKUP(B$9&ROW(A1),IF({1,0},$B$2:$B$6&COUNTIF(INDIRECT('b2:b'&ROW($2:$6)),B$9),$C$2:$C$6),2,),按SHIFT+CTRL+ENTER鍵結(jié)束。
python實(shí)現(xiàn):vlookup函數(shù)有兩個(gè)不足(或者算是特點(diǎn)吧),一個(gè)是被查找的值一定要在區(qū)域里的第一列,另一個(gè)是只能查找一個(gè)值,剩余的即便能匹配也不去查找了,這兩點(diǎn)都能通過(guò)靈活應(yīng)用if和indirect函數(shù)來(lái)解決,不過(guò)pandas能做得更直白一些。
df6 = pd.read_excel('test.xlsx', sheet_name='消費(fèi)額')df6[df6['姓名'] == '張一'][['姓名', '消費(fèi)額']]Out[]: 姓名 消費(fèi)額0 張一 1002 張一 3004 張一 1000
操作可見(jiàn),其實(shí)Excel在有些地方還是非常方便的。比如:
數(shù)據(jù)量不是很大;
不需要實(shí)時(shí)更新結(jié)果;
更改原數(shù)據(jù),即時(shí)看每次結(jié)果有多大不同;
只要一個(gè)大體概念和粗略分析;
不需要長(zhǎng)期使用和維護(hù)...
相對(duì)而言,Python的優(yōu)點(diǎn)在于:
處理數(shù)據(jù)功能很強(qiáng)大;
圖形展示很高級(jí);
大數(shù)據(jù)量也能處理;
運(yùn)行速度可以分布管理;
可以邊寫(xiě),邊測(cè)試;
很多免費(fèi)好資源直接使用;
可追溯錯(cuò)誤出在哪里;
很容易就實(shí)現(xiàn)自動(dòng)化;
邊寫(xiě)代碼,邊做文檔;
用的很舒服,哈哈!
所以我們在處理數(shù)據(jù)時(shí)也需要正確選擇使用的工具!
聯(lián)系客服