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