網站首頁 編程語言 正文
楔子
估計有不少小伙伴在將 DataFrame 導入到 Excel 的時候,都遇到過下面這種尷尬的情況:
- 想將多個 DataFrame 導入到一個 Excel 文件的多個 sheet 中,但是卻發現生成的 Excel 文件里面只有最后一個 sheet;
- 想給一個現有的 Excel 文件追加一個 sheet,結果發現其它的 sheet 都沒了,只剩下新追加的 sheet;
那么下面就來看看如何解決這些問題。
同時導入多個 sheet
如果想導入多個 sheet,那么肯定不能使用原來?to_excel("文件名")?的方式,那樣只會保留最后一個 sheet。我們應該使用類 ExcelWriter 實現:
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]})
#?調用pd.ExcelWriter,?需要指定mode="a",?engine="openpyxl"
#?注意:?將mode設置為"a"表示追加,?但是它要求文件必須存在,?否則報錯
"""
writer?=?pd.ExcelWriter("test.xlsx",?mode="a",?engine="openpyxl")
"""
#?因此我們需要生成這個文件,此時順便將第一個?DataFrame?導進去
df1.to_excel("test.xlsx",?index=False,?sheet_name="a")
#?然后再實例化ExcelWriter
writer?=?pd.ExcelWriter("test.xlsx",?mode="a",?engine="openpyxl")
#?接下來還是調用to_excel,?但是第一個參數不再是文件名,?而是上面的writer
#?將剩下的兩個DataFrame寫進去
df2.to_excel(writer,?index=False,?sheet_name="b")
df3.to_excel(writer,?index=False,?sheet_name="c")
#?保存并關閉writer,?寫入磁盤
writer.save()
writer.close()
執行代碼,然后打開文件看一下。
此時我們看到結果是沒有問題的,當然向已存在的 Excel 文件追加 sheet 也是同理。
覆蓋一個 sheet
向 Excel 文件同時寫入多個sheet,以及追加sheet,我們已經知道該怎么做了,然后是覆蓋 sheet。首先我們覆蓋 sheet 的時候還要保證其它 sheet 不受影響,所以 mode 仍然要設置為追加模式。
下面問題來了,我們上面的 Excel 文件有 "a"、"b"、"c" 三個 sheet,假設我們想將 "b" 這個 sheet 覆蓋掉,應該怎么做呢?可能有人認為,在追加的時候還指定 sheet_name="b" 不就行了,然鵝答案是不行的。
我們看到如果已有同名 sheet,那么不會覆蓋,還是創建一個新的 sheet,并自動在結尾處加一個 1。如果我們在此基礎上再寫入 "b" 這個 sheet 的話,那么又會多出一個名為 "b2" 的sheet。所以最好的辦法是,在導入之前先將 sheet 刪除。
import?pandas?as?pd
writer?=?pd.ExcelWriter("test.xlsx",?mode="a",?
????????????????????????engine="openpyxl")
wb?=?writer.book
#?pandas操作Excel底層也是依賴于其它的模塊,?比如xlrd、openpyxl
#?所以這里的?wb?=?writer.book??就相當于
"""
from?openpyxl?import?load_workbook
wb?=?load_workbook("test.xlsx")
"""
#?查看已存在的所有的sheet,?總共是5個
#?其中?"b1"和"b2"?是自動創建的
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?給刪除了
#?所以再導入?"b"?的時候就不會出現?"b3"?了
#?當然?"b1"?和?"b2"?也順便被我們給刪掉了
df.to_excel(writer,?index=True,?sheet_name="b")
writer.save()
writer.close()
我們看到 "b1"、"b2" 兩個 sheet 就沒了,當然我們刪除的還有 "b" 這個sheet,只不過又重新創建了,當然數據也是我們創建的新數據。
另外可能有人發現多個 sheet 的順序不再是原來的 "a"、"b"、"c",這是因為在刪除 "b" 之后,"a" 和 "c" 就靠在一起了,所以新寫入 "b" 的時候就排在 "c" 的后面了,當然個人覺得這沒有什么太大影響。
原文鏈接:https://mp.weixin.qq.com/s/Omo2e0PMAo_rtF7GSWGCFw
相關推薦
- 2022-03-23 C++函數模板的使用詳解_C 語言
- 2022-08-16 Kotlin空安全空類型淺談_Android
- 2022-08-26 如何利用python在剪貼板上讀取/寫入數據_python
- 2022-11-07 關于react?父子組件的執行順序_React
- 2022-07-03 kali下對Docker的詳細安裝教程_docker
- 2023-04-22 GO的range如何使用詳解_Golang
- 2022-07-09 基于fluttertoast實現封裝彈框提示工具類_Android
- 2022-04-23 實現一個內容超出顯示省略號,并鼠標浮入顯示tooltip,不超出的不顯示tooltip組件
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支