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