日常的數(shù)據(jù)分析工作中,很多時候我們會通過excel的形式將分析結果展示給領導或同事。前面一些文章我們也簡單提到過pandas與excel的i/o問題,今天我們再深入一步,如何將多個分析后的結果,也就是多個DataFrame,寫入同一個excel工作簿中呢?
直奔主題。
先導入包,然后用字典構建一個測試用的DF:
然后讓它繁衍一下,復制幾個同樣的DF出來待用:
之前說到過,用Python的pandas包把數(shù)據(jù)結構寫入excel,主要用到的是pd.to_excel()。然而比較尷尬的是,這個方法缺少了一個類似pd.to_csv()中的mode參數(shù),以至于你每次用諸如pd.to_excel(文件名)的形式去寫入excel時,系統(tǒng)都會幫你重新創(chuàng)建一個新的文件。也就意味著前面的文件會被覆蓋掉,你得到的只能是最后一個DF寫入的結果文件。
那么,有其他的辦法,讓好幾個DF寫入到同一個excel文件中嗎?
如果這樣常見的問題都沒法解決的話,人生苦短,我用Python也就白說這么多年了。我們可以通過創(chuàng)建一個ExcelWriter對象,來完美解決上面的問題。代碼如下:
這個寫入對象,會幫我們將DF寫入到test1這個excel工作簿中。
接下來我們依次將之前創(chuàng)建和繁衍好的DF寫入到df1到df4這四個工作表中,如下:
到這里,有的朋友發(fā)現(xiàn)問題了,為什么我運行完代碼,還是沒有看到創(chuàng)建的excel工作簿呢?實際上,上面那一步做完,數(shù)據(jù)還只是存在于緩存中,需要我們再運行下面一句代碼,數(shù)據(jù)才能寫入到硬盤中:
我們打開新鮮出爐的test1文件來檢查一下,發(fā)現(xiàn)一共有四個工作表,表里頭的數(shù)據(jù)也跟我們寫入的相同,沒有出現(xiàn)錯誤:
另外,如果想把這四個DF都寫在同一個工作簿的同一個工作表里,又該怎么辦呢?
熟悉pd.to_excel()朋友不難想到,可以利用startcol和startrow這兩個參數(shù)來實現(xiàn):
如上,我們重新創(chuàng)建一個writer2對象,在將DF寫入到excel的時候,并沒有傳遞sheet_name參數(shù),這也就意味著所有的DF都會默認寫入到Sheet1里頭。
為了防止DF都寫入到工作表同一地方以至于出現(xiàn)重合情況,我們可以設置DF在寫入時的起始行和起始列。如df1沒有傳遞除writer2以外的任何參數(shù),則會默認從Sheet1的第一行第一列開始寫入數(shù)據(jù)。df2指定startcol=8,意即該DF在寫入到Sheet1中時,會從第一行第九列(不是第八列開始,不明白這塊的同學可以去官網(wǎng)看看這個參數(shù)到底是什么意思,好好理解一下Python和excel起始數(shù)字的不同之處?。。。╅_始寫入數(shù)據(jù)。同樣的,df3會從第11行第1列開始寫入數(shù)據(jù),df4會從第11行第9列寫入數(shù)據(jù)。
接著writer2.save()一下,數(shù)據(jù)寫入到硬盤,我們來檢查一下:
呈現(xiàn)出的結果跟我們的需求是一樣的。當然,格式方面,還需要自己再稍微調整一下。
最后說一個舊聞,據(jù)說微軟已經(jīng)考慮要把Python接納為excel的操作腳本語言之一了?;蛟S在不久的將來,除了vba之外,你還可以直接在excel里用Python來做一些自動化的事情了。想想還挺美,期待一下吧。