解決Pandas生成Excel時的sheet問題的方法總結(jié)
楔子
估計有不少小伙伴在將 DataFrame 導(dǎo)入到 Excel 的時候,都遇到過下面這種尷尬的情況:
- 想將多個 DataFrame 導(dǎo)入到一個 Excel 文件的多個 sheet 中,但是卻發(fā)現(xiàn)生成的 Excel 文件里面只有最后一個 sheet;
- 想給一個現(xiàn)有的 Excel 文件追加一個 sheet,結(jié)果發(fā)現(xiàn)其它的 sheet 都沒了,只剩下新追加的 sheet;
那么下面就來看看如何解決這些問題。
同時導(dǎo)入多個 sheet
如果想導(dǎo)入多個 sheet,那么肯定不能使用原來 to_excel("文件名") 的方式,那樣只會保留最后一個 sheet。我們應(yīng)該使用類 ExcelWriter 實現(xiàn):
import?pandas?as?pd df1?=?pd.DataFrame({"a":?[1,?2],?"b":?[3,?4]}) df2?=?pd.DataFrame({"a":?[2,?3],?"b":?[4,?5]}) df3?=?pd.DataFrame({"a":?[3,?4],?"b":?[5,?6]}) #?調(diào)用pd.ExcelWriter,?需要指定mode="a",?engine="openpyxl" #?注意:?將mode設(shè)置為"a"表示追加,?但是它要求文件必須存在,?否則報錯 """ writer?=?pd.ExcelWriter("test.xlsx",?mode="a",?engine="openpyxl") """ #?因此我們需要生成這個文件,此時順便將第一個?DataFrame?導(dǎo)進去 df1.to_excel("test.xlsx",?index=False,?sheet_name="a") #?然后再實例化ExcelWriter writer?=?pd.ExcelWriter("test.xlsx",?mode="a",?engine="openpyxl") #?接下來還是調(diào)用to_excel,?但是第一個參數(shù)不再是文件名,?而是上面的writer #?將剩下的兩個DataFrame寫進去 df2.to_excel(writer,?index=False,?sheet_name="b") df3.to_excel(writer,?index=False,?sheet_name="c") #?保存并關(guān)閉writer,?寫入磁盤 writer.save() writer.close()
執(zhí)行代碼,然后打開文件看一下。
此時我們看到結(jié)果是沒有問題的,當(dāng)然向已存在的 Excel 文件追加 sheet 也是同理。
覆蓋一個 sheet
向 Excel 文件同時寫入多個sheet,以及追加sheet,我們已經(jīng)知道該怎么做了,然后是覆蓋 sheet。首先我們覆蓋 sheet 的時候還要保證其它 sheet 不受影響,所以 mode 仍然要設(shè)置為追加模式。
下面問題來了,我們上面的 Excel 文件有 "a"、"b"、"c" 三個 sheet,假設(shè)我們想將 "b" 這個 sheet 覆蓋掉,應(yīng)該怎么做呢?可能有人認(rèn)為,在追加的時候還指定 sheet_name="b" 不就行了,然鵝答案是不行的。
我們看到如果已有同名 sheet,那么不會覆蓋,還是創(chuàng)建一個新的 sheet,并自動在結(jié)尾處加一個 1。如果我們在此基礎(chǔ)上再寫入 "b" 這個 sheet 的話,那么又會多出一個名為 "b2" 的sheet。所以最好的辦法是,在導(dǎo)入之前先將 sheet 刪除。
import?pandas?as?pd writer?=?pd.ExcelWriter("test.xlsx",?mode="a",? ????????????????????????engine="openpyxl") wb?=?writer.book #?pandas操作Excel底層也是依賴于其它的模塊,?比如xlrd、openpyxl #?所以這里的?wb?=?writer.book??就相當(dāng)于 """ from?openpyxl?import?load_workbook wb?=?load_workbook("test.xlsx") """ #?查看已存在的所有的sheet,?總共是5個 #?其中?"b1"和"b2"?是自動創(chuàng)建的 print(wb.sheetnames)??#?['a',?'b',?'c',?'b1',?'b2'] #?下面我們來刪除sheet wb.remove(wb["b1"]) wb.remove(wb["b2"]) wb.remove(wb["b"]) df?=?pd.DataFrame({"name":?["古明地覺",?"古明地戀"]}) #?我們將?b?這個?sheet?給刪除了 #?所以再導(dǎo)入?"b"?的時候就不會出現(xiàn)?"b3"?了 #?當(dāng)然?"b1"?和?"b2"?也順便被我們給刪掉了 df.to_excel(writer,?index=True,?sheet_name="b") writer.save() writer.close()
我們看到 "b1"、"b2" 兩個 sheet 就沒了,當(dāng)然我們刪除的還有 "b" 這個sheet,只不過又重新創(chuàng)建了,當(dāng)然數(shù)據(jù)也是我們創(chuàng)建的新數(shù)據(jù)。
另外可能有人發(fā)現(xiàn)多個 sheet 的順序不再是原來的 "a"、"b"、"c",這是因為在刪除 "b" 之后,"a" 和 "c" 就靠在一起了,所以新寫入 "b" 的時候就排在 "c" 的后面了,當(dāng)然個人覺得這沒有什么太大影響。
以上就是解決Pandas生成Excel時的sheet問題的方法總結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Pandas生成Excel sheet問題的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
使用Pycharm為項目創(chuàng)建一個虛擬環(huán)境完整圖文教程
這篇文章主要給大家介紹了關(guān)于使用Pycharm為項目創(chuàng)建一個虛擬環(huán)境的相關(guān)資料,我們在使用pycharm做項目時,最好給每一個工程都創(chuàng)建一個虛擬環(huán)境,將對應(yīng)的安裝包放在該虛擬環(huán)境中,避免項目與項目之間產(chǎn)生關(guān)系或沖突,便于管理,需要的朋友可以參考下2023-09-09Python深度學(xué)習(xí)pytorch神經(jīng)網(wǎng)絡(luò)Dropout應(yīng)用詳解解
這篇文章主要為大家介紹了Python深度學(xué)習(xí)中關(guān)于pytorch神經(jīng)網(wǎng)絡(luò)Dropout的應(yīng)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-10-10Python統(tǒng)計分析模塊statistics用法示例
這篇文章主要介紹了Python統(tǒng)計分析模塊statistics用法,結(jié)合實例形式分析了Python統(tǒng)計分析模塊statistics計算平均數(shù)、中位數(shù)、出現(xiàn)次數(shù)、標(biāo)準(zhǔn)差等相關(guān)操作技巧,需要的朋友可以參考下2019-09-09python入門語句基礎(chǔ)之if語句、while語句
本文介紹了python入門語句基礎(chǔ)之if語句、while語句,if?語句讓你能夠檢查程序的當(dāng)前狀態(tài),并據(jù)此采取相應(yīng)的措施,而for?循環(huán)用于針對集合中的每個元素都一個代碼塊,而?while?循環(huán)不斷地運行,直到指定的條件不滿足為止,本文通過示例代碼詳解介紹,需要的朋友參考下吧2022-04-04Django項目創(chuàng)建到啟動詳解(最全最詳細(xì))
這篇文章主要給大家介紹了關(guān)于Django項目創(chuàng)建到啟動的步驟,本文介紹的方法算是最全最詳細(xì)的一個項目,需要的朋友可以參考下2019-09-09Python3.6實現(xiàn)根據(jù)電影名稱(支持電視劇名稱),獲取下載鏈接的方法
這篇文章主要介紹了Python3.6實現(xiàn)根據(jù)電影名稱(支持電視劇名稱),獲取下載鏈接的方法,涉及Python爬蟲與正則相關(guān)操作技巧,需要的朋友可以參考下2019-08-08