pandas追加写入excel_[Excel]如果你爱Excel,请学好pandas
現(xiàn)在坐辦公室的各種大小團(tuán)體里,都會(huì)有一個(gè)“懂Excel的人”,可能那個(gè)人是團(tuán)體里的一員,也可能是和這個(gè)團(tuán)隊(duì)關(guān)系比較好的一個(gè)熱心人,但總之,你的身邊會(huì)有這么一個(gè)人。如果你環(huán)顧四周也沒(méi)發(fā)現(xiàn),那可能你就是那個(gè)懂Excel的人。
從基本的打印添加表頭,到篩選排序,再到vlookup各種花式,Excel確實(shí)是促進(jìn)生產(chǎn)力的一大利器,不過(guò)這個(gè)工具為了保證易用性也做了很多的妥協(xié),包括但不限于:
很多人應(yīng)該都聽(tīng)過(guò)這樣一個(gè)新聞:數(shù)據(jù)汪:日本老爺爺堅(jiān)持17年用Excel作畫(huà),我可能用了假的Excel 當(dāng)然老人家的確是很厲害,但是從另外一個(gè)角度來(lái)說(shuō),一個(gè)用來(lái)處理數(shù)據(jù)的軟件,在軟件的輸入端竟然可以畫(huà)畫(huà),難道不也說(shuō)明了這個(gè)軟件是多么的隨和以及不專(zhuān)業(yè)。畢竟數(shù)據(jù)處理不是畫(huà)畫(huà),最基本的原則還是要遵守的。
2. 將數(shù)據(jù)呈現(xiàn)和數(shù)據(jù)處理混在一起
數(shù)據(jù)的錄入,分析與計(jì)算對(duì)數(shù)據(jù)表的格式是有需求的,所以看起來(lái)會(huì)不大美觀。如果要美觀,你需要的是數(shù)據(jù)分析報(bào)告。不過(guò)Excel里面不管是報(bào)告、原始數(shù)據(jù)還是圖標(biāo)都是一籮筐放在數(shù)據(jù)表里面。
然后就是讓人深?lèi)和唇^的合并單元格
3. 黑箱一時(shí)爽,回頭火葬場(chǎng)
Excel會(huì)自動(dòng)對(duì)數(shù)據(jù)進(jìn)行格式轉(zhuǎn)化。一個(gè)比較經(jīng)典的例子就是“MARC1”基因這個(gè)例子。在Excel里面這個(gè)字符會(huì)自動(dòng)被轉(zhuǎn)換成3月1日。有人寫(xiě)了個(gè)小程序“解決”了這個(gè)問(wèn)題,然后在Plos one上面發(fā)了個(gè)文章。
然后復(fù)制粘貼過(guò)程中的自動(dòng)偏移,vlookup在大表格里對(duì)性能的考驗(yàn)……
但是,Excel絕對(duì)是非常強(qiáng)大的一個(gè)軟件,之所以有時(shí)候會(huì)犯傻,那也只是大智若愚,畢竟為了照顧用戶(hù)總是要做一些犧牲的。
“這個(gè)問(wèn)題用Excel怎么解決呢?”用Pandas吧
比如吧,交叉表怎么轉(zhuǎn)換回?cái)?shù)據(jù)表呢?Excel有數(shù)據(jù)透視表的功能,可以將數(shù)據(jù)表轉(zhuǎn)換成交叉表,但是沒(méi)有反向轉(zhuǎn)換的功能。VBA是一個(gè)選項(xiàng),但是,拜托,既然你已經(jīng)開(kāi)始講編程提上日程了,那難道不應(yīng)該選擇更加流行一點(diǎn)的語(yǔ)言么?
TIOBE index,2019年8月你們心心念念的VB排在16位,VB .NET排在第六位,是不錯(cuò)啦,比起Swift,Perl,R這些來(lái)說(shuō)的話。但是Python好歹也是排在第3呀,真的不考慮一下么?
pandas是一個(gè)數(shù)據(jù)處理的庫(kù),基于python語(yǔ)言。下面舉幾個(gè)例子展示一下pandas的能力:
讀取和寫(xiě)入Excel文件
讀取和寫(xiě)入csv就相當(dāng)簡(jiǎn)單了,但是excel的話還是需要首先安裝幾個(gè)包:(xlrd,xlsxwriter)
讀取:
import pandas as pd xl_file = pd.ExcelFile('filepath.xlsx') #接受excel文件路徑,建立Excel文件對(duì)象 df = xl_file.parse('Sheet_name') #parse接受工作表名稱(chēng),將工作表轉(zhuǎn)換成Dataframedf現(xiàn)在就是一個(gè)dataframe了,你可以用df.columns看看表頭有哪些列,你可以用df.loc['行標(biāo)簽','列標(biāo)簽']獲取/設(shè)置特定位置的內(nèi)容,用apply,或者是向量化運(yùn)算處理數(shù)據(jù)
寫(xiě)入:
xl_writer = pd.ExcelWriter('out.xlsx',engine='xlsxwriter') df.to_excel(xl_writer,'Sheet0') xl_writer.save() pandas.DataFrame.to_excel - pandas 0.25.1 documentation?pandas.pydata.org所以說(shuō),pandas讀取和寫(xiě)入Excel文件都是非常容易的。
交叉表變數(shù)據(jù)表
用下面的一組數(shù)據(jù)為例
df = pd.DataFrame([['jane',20,83,41],['tom',22,89,82],['mike',24,55,93]],columns=['name','age','grade_curr1','grade_curr2']) df Out[10]: name age grade_curr1 grade_curr2 0 jane 20 83 41 1 tom 22 89 82 2 mike 24 55 93可以看到這里有三行數(shù)據(jù),包括了姓名,年齡,以及兩個(gè)科目的成績(jī)。第三列和第四列其實(shí)都是成績(jī),所以如果能放在一列會(huì)更方便后續(xù)的分析。
df_melted = df.melt(id_vars=['name','age'],value_vars=['grade_curr1','grade_curr2']) df_melted Out[13]: name age variable value 0 jane 20 grade_curr1 83 1 tom 22 grade_curr1 89 2 mike 24 grade_curr1 55 3 jane 20 grade_curr2 41 4 tom 22 grade_curr2 82 5 mike 24 grade_curr2 93分組統(tǒng)計(jì)
可能看了上面的例子你沒(méi)有覺(jué)得哪里更“方便”了。那讓我們加一些細(xì)節(jié)。比如現(xiàn)在還是這三個(gè)人,分別接受兩個(gè)項(xiàng)目的考試(curr1和curr2),每個(gè)考試可以最多參加3次,但是也有人只參加了1次。所以成績(jī)登記出來(lái)是下面這樣的:
如果現(xiàn)在要求空白數(shù)據(jù)不納入分析(比如jane的科目1只參加了兩次考試,所以平均分應(yīng)該是74+80/2=77)。那……用Excel你準(zhǔn)備怎么做呢?要濾掉空白項(xiàng)那你必須用篩選呀,用篩選就……肯定要形成數(shù)據(jù)表呀……
import pandas as pd import osos.chdir('/Users/zheng/Desktop/') xl = pd.ExcelFile('工作簿1.xlsx') df = xl.parse('工作表1') print(df)name age cur1_trial1 ... cur2_trial1 cur2_trial2 cur2_trial3 0 jane 20 74 ... NaN 88.0 89 1 tom 23 65 ... 78.0 82.0 48 2 mike 21 90 ... NaN NaN 87[3 rows x 8 columns]轉(zhuǎn)換成數(shù)據(jù)表
df_melt = df.melt(id_vars=['name','age']) df_melt.head() Out[6]: name age variable value 0 jane 20 cur1_trial1 74.0 1 tom 23 cur1_trial1 65.0 2 mike 21 cur1_trial1 90.0 3 jane 20 cur1_trial2 NaN 4 tom 23 cur1_trial2 66.0好了,接下來(lái)可以先篩選掉那些空值
df_filtered = df_melt[pd.notna(df_melt['value'])] df_filtered.head() Out[8]: name age variable value 0 jane 20 cur1_trial1 74.0 1 tom 23 cur1_trial1 65.0 2 mike 21 cur1_trial1 90.0 4 tom 23 cur1_trial2 66.0 5 mike 21 cur1_trial2 91.0之前id=3的那一行已經(jīng)被過(guò)濾了。接下來(lái)我們要求平均數(shù)
那如果是在excel里面我們可以用到averageifs,當(dāng)然了我不知道Excel對(duì)于求標(biāo)準(zhǔn)差,方差,樣本估算總體方差,中值,1st quater,3rd quater,極差……等等等等這些東西有沒(méi)有ifs函數(shù),畢竟我不care。
況且上面的數(shù)據(jù)還有個(gè)坑,我把兩列數(shù)據(jù)合并成一列了(cur1_trial1是兩個(gè)東西:科目和試驗(yàn)次數(shù)) :)
不用擔(dān)心,可以用.str.split
df_splitted = df_filtered['variable'].str.split('_',expand=True) df_splitted Out[17]: 0 1 0 cur1 trial1 1 cur1 trial1 2 cur1 trial1 4 cur1 trial2 5 cur1 trial2 6 cur1 trial3 7 cur1 trial3 10 cur2 trial1 12 cur2 trial2 13 cur2 trial2 15 cur2 trial3 16 cur2 trial3 17 cur2 trial3配合改個(gè)名
df_splitted = df_splitted.rename({0:'curriculum',1:'trial'},axis=1) df_splitted.head() Out[23]: curriculum trial 0 cur1 trial1 1 cur1 trial1 2 cur1 trial1 4 cur1 trial2 5 cur1 trial2ok,現(xiàn)在把df_filtered和df_splitted合并一下
df_comb = pd.concat([df_filtered,df_splitted],axis=1) df_comb.head() Out[25]: name age variable value curriculum trial 0 jane 20 cur1_trial1 74.0 cur1 trial1 1 tom 23 cur1_trial1 65.0 cur1 trial1 2 mike 21 cur1_trial1 90.0 cur1 trial1 4 tom 23 cur1_trial2 66.0 cur1 trial2 5 mike 21 cur1_trial2 91.0 cur1 trial2注意到兩個(gè)axis=1,這是設(shè)置操作的方向。大體上來(lái)說(shuō),0就是默認(rèn)的,1呢,就是換一個(gè)方向。
接下來(lái)回到求平均值的問(wèn)題
df_comb.groupby(['name','curriculum','age']).mean() Out[30]: value name curriculum age jane cur1 20 77.000000cur2 20 88.500000 mike cur1 21 90.500000cur2 21 87.000000 tom cur1 23 64.000000cur2 23 69.333333所以呢,這個(gè)按姓名和課程的分組就搞定了,多容易。
類(lèi)似的:
一行變多行:路人乙小明:[python]Shit, 我完全不明白為什么這么做會(huì)work,但是it worked!
萬(wàn)能的apply:路人乙小明:[pandas]emm……一旦你接受了這個(gè)設(shè)定:pandas的apply
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的pandas追加写入excel_[Excel]如果你爱Excel,请学好pandas的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么生成网址(网址创建)
- 下一篇: 怎么修改栏目id(怎么修改栏目)