excel占領(lǐng)辦公領(lǐng)域已經(jīng)大半個世紀(jì)乡革,進(jìn)入人工智能新時代后,其霸主地位受到python等語言和工具的挑戰(zhàn)摊腋。編程不再是專業(yè)人士的專利沸版,而是“飛入尋常百姓家”的日用工具了,在前面那篇表哥表姐歌豺!是時候扔掉Excel了文章里推穷,已經(jīng)闡明了這個觀點(diǎn)。
用Python來做Excel的活
接下來类咧,我們會用更實(shí)際的例子來證明Python已經(jīng)是Excel無可比擬的對手馒铃,是Excel的掘墓人。在這些例子里會展示一些常見的Excel任務(wù)以及如何在python的pandas中執(zhí)行類似的任務(wù)痕惋。雖然例子有些微不足道区宇,但足夠能體現(xiàn)用python來化繁為簡的創(chuàng)造性的解決問題的能力呢。
向行添加總和
介紹的第一項(xiàng)任務(wù)是匯總列數(shù)據(jù)值戳,并添加總列议谷。
首先將excel數(shù)據(jù)導(dǎo)入到pandas數(shù)據(jù)幀中。
import pandas as pdimport numpy as npdf = pd.read_excel("excel-comp-data.xlsx")df.head()
結(jié)果如下:
接下來堕虹,進(jìn)行求和:
df [ “total” ] = df [ “Jan” ] + df [ “Feb” ] + df [ “Mar” ] df .head()
接下來卧晓,按每個月匯總。以下是執(zhí)行的操作赴捞,如Excel中所示:
如上圖所示逼裆,在excel中用 SUM(G2:G16) 在每列中添加了第17行,以按月獲得總計(jì)赦政。
這種列操作在python中簡直是小意思胜宇。
df [ “Jan” ] 。sum (), df [ “Jan” ] 桐愉。mean ()财破,df [ “Jan” ] 。min ()从诲,df [ “Jan” ] 左痢。max ()(1462000,97466.666666666672,10000,162000)
自動糾錯轉(zhuǎn)換
再舉一個例子,將狀態(tài)縮寫添加到數(shù)據(jù)集中盏求。
從Excel的角度來看抖锥,最簡單的方法可能是添加一個新列,對州名進(jìn)行vlookup并填寫縮寫碎罚。
這里是excel操作結(jié)果:
您會注意到執(zhí)行vlookup后磅废,有些值無法正確顯示。那是因?yàn)槠村e了一些州荆烈。在在大數(shù)據(jù)集情況下拯勉,Excel中處理這將是非常具有挑戰(zhàn)性的。
幸運(yùn)的是憔购,python可以搞定宫峦,而且非常容易。wuzzy庫非常棒玫鸟,可以自動糾錯导绷。
首先安裝wuzzy 庫。
pip install wuzzy
首先導(dǎo)入適當(dāng)?shù)膄uzzywuzzy函數(shù)并定義我們的狀態(tài)映射字典屎飘。
from fuzzywuzzy import fuzzfrom fuzzywuzzy import processstate_to_code = {"VERMONT": "VT", "GEORGIA": "GA", "IOWA": "IA", "Armed Forces Pacific": "AP", "GUAM": "GU","KANSAS": "KS", "FLORIDA": "FL", "AMERICAN SAMOA": "AS", "NORTH CAROLINA": "NC", "HAWAII": "HI", "NEW YORK": "NY", "CALIFORNIA": "CA", "ALABAMA": "AL", "IDAHO": "ID", "FEDERATED STATES OF MICRONESIA": "FM", "Armed Forces Americas": "AA", "DELAWARE": "DE", "ALASKA": "AK", "ILLINOIS": "IL", "Armed Forces Africa": "AE", "SOUTH DAKOTA": "SD", "CONNECTICUT": "CT", "MONTANA": "MT", "MASSACHUSETTS": "MA", "PUERTO RICO": "PR", "Armed Forces Canada": "AE", "NEW HAMPSHIRE": "NH", "MARYLAND": "MD", "NEW MEXICO": "NM", "MISSISSIPPI": "MS", "TENNESSEE": "TN", "PALAU": "PW", "COLORADO": "CO", "Armed Forces Middle East": "AE", "NEW JERSEY": "NJ", "UTAH": "UT", "MICHIGAN": "MI", "WEST VIRGINIA": "WV", "WASHINGTON": "WA","MINNESOTA": "MN", "OREGON": "OR", "VIRGINIA": "VA", "VIRGIN ISLANDS": "VI", "MARSHALL ISLANDS": "MH", "WYOMING": "WY", "OHIO": "OH", "SOUTH CAROLINA": "SC", "INDIANA": "IN", "NEVADA": "NV", "LOUISIANA": "LA", "NORTHERN MARIANA ISLANDS": "MP", "NEBRASKA": "NE", "ARIZONA": "AZ", "WISCONSIN": "WI", "NORTH DAKOTA": "ND", "Armed Forces Europe": "AE", "PENNSYLVANIA": "PA", "OKLAHOMA": "OK", "KENTUCKY": "KY", "RHODE ISLAND": "RI", "DISTRICT OF COLUMBIA": "DC", "ARKANSAS": "AR", "MISSOURI": "MO", "TEXAS": "TX", "MAINE": "ME"}
以下是wuzzy模糊文本匹配功能如何工作的一些例子妥曲。
process.extractOne("Minnesotta",choices=state_to_code.keys())('MINNESOTA', 95)process.extractOne("AlaBAMMazzz",choices=state_to_code.keys(),score_cutoff=80)
現(xiàn)在我們知道它是如何工作的,創(chuàng)建函數(shù)來獲取狀態(tài)列并將其轉(zhuǎn)換為有效的縮寫钦购。對此數(shù)據(jù)使用80 score_cutoff檐盟。您可以使用它來查看適用于您的數(shù)據(jù)的數(shù)字。你會注意到要么返回一個有效的縮寫押桃,要么np.nan 字段中有一些有效的值葵萎。
def convert_state(row):abbrev = process.extractOne(row["state"],choices=state_to_code.keys(),score_cutoff=80)if abbrev: return state_to_code[abbrev[0]] return np.nan
在想要的位置添加列,并用NaN值填充它:
df_final.insert(6, "abbrev", np.nan)df_final.head()
使用 apply 將縮寫添加到approriate列中唱凯。
df_final [ 'abbrev' ] = df_final 羡忘。apply (convert_state , axis = 1 )df_final.head()
一個非常簡單的智能清理數(shù)據(jù)功能開發(fā)完畢磕昼。當(dāng)數(shù)據(jù)只有15行左右時壳坪,這不是什么大問題。但是掰烟,如果有15,000呢?難道你想在Excel中一行行手動來處理這些?
分類匯總
本文的末尾,按州匯總一些數(shù)據(jù)纫骑。
在Excel中蝎亚,將使用該 subtotal 工具執(zhí)行此操作。
輸出看起來像這樣:
在pandas中創(chuàng)建小計(jì)是使用groupby來實(shí)現(xiàn)匯總先馆。
df_sub = df_final [[ “abbrev” 发框,“Jan” ,“Feb” 煤墙,“Mar” 梅惯,“total” ]] 。groupby ('abbrev' )仿野。sum ()df_sub
接下來铣减,通過使用 applymap 數(shù)據(jù)框中的所有值將數(shù)據(jù)格式化為貨幣。注意脚作,定義的money函數(shù)葫哗,用在apply里很高效。
def money(x):return "${:,.0f}".format(x)formatted_df = df_sub.applymap(money)formatted_df
處理后的格式看起來不錯球涛,接下來按月份進(jìn)行匯總劣针。
sum_row=df_sub[["Jan","Feb","Mar","total"]].sum()sum_rowJan 1462000Feb 1507000Mar 717000total 3686000dtype: int64
將值轉(zhuǎn)換為列并對其進(jìn)行格式化。
df_sub_sum = pd 亿扁。DataFrame (data = sum_row )捺典。T df_sub_sum = df_sub_sum 。applymap (money )df_sub_sum
最后从祝,將總值添加到DataFrame襟己。
final_table = formatted_df.append(df_sub_sum)final_table
您會注意到數(shù)據(jù)的最末尾索引為“0”。如何重命名為一個有意義的名字呢哄褒?用 rename 稀蟋。
final_table = final_table.rename(index={0:"Total"})final_table
最后發(fā)現(xiàn),索引變?yōu)榱薚otal呐赡,一切都很完美了退客!
結(jié)論
希望本文能幫助到那些希望替換掉Excel并換用Python的朋友。希望這些例子可以幫助其他人相信他們可以用Python來避免大量Excel數(shù)據(jù)操作链嘀。如果您有其他Excel操作萌狂,自己試驗(yàn)過,但是仍然沒成功怀泊,而且想要學(xué)習(xí)如何在python里來進(jìn)行相應(yīng)操作茫藏,請通過以下評論告訴我,我會盡力提供幫助霹琼。
文章來源于:https://m.toutiaocdn.com/item/6709825784422334990/?app=news_article&;timestamp=1562943039&req_id=201907122250390100280171323446F62&group_id=6709825784422334990