いろいろ倉庫

KNIME、EXCEL、R、Pythonなどの備忘録

【Python】DataFrameをEXECELファイルにシートとして追加したい。

・お題:DataFrameをEXCELファイルとして出力したい。できれば、既存のファイルにシートを付け足す感じで出力したい。

 

・前提として、pandasとopenpyxlが使える状態であるとする。

・DataFrameを作成する。

import pandas as pd
df=pd.DataFrame({"A":[1,2,3],"B":[4,5,6],"C":[7,8,9]},index=["a","b","c"])

・新たなEXCELファイルとして保存するなら、以下で良さそう。

df.to_excel("20221023test.xlsx", sheet_name="test")

 

・できれば、既存のファイルにシートとしてDataFrameを追加したい。pandasでは難しそうだったので、openpyxlでやってみた。正しいことは以下の公式HPを参照して欲しい。

openpyxl.readthedocs.io

・df2を作成。

df2=pd.DataFrame({"D":[1,2,3],"E":[4,5,6],"F":[7,8,9]},index=["d","e","f"])

・ほとんど公式HPの通り。

import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows
wb = openpyxl.load_workbook("20221023test.xlsx")
ws = wb.create_sheet("test2")

for r in dataframe_to_rows(df2, index=True, header=True):
    ws.append(r)
wb.save("20221023test.xlsx")

・これで、以下のようにEXCELファイルに新たなシートが追加された(LibreOfficeでごめんなさい)。

・2行目の空白行が気になるのであれば、以下のように削除しても良いかも。

ws.delete_rows(2, amount=1)
wb.save("20221023test.xlsx")

 

・ちなみに、この「一つのファイルにシートとしてDataFrameを出力する」の操作を繰り返すと、シートは上書きされず、test2,test21,test22,...と増えていく。特定のシートを上書きしたいのであれば、以下のようにシートを消してから同じ名前のシートを作れば良いのかなと思う。

wb.remove(wb["test2"])

 

・実際使う場合は、シート名を変数に格納して、wb.sheetnamesとかでwbからシート名を取得して、その中に同じ名前のシートがあるのか確認してから処理が流れるようにした方がトラブルが少ないかもしれない。上書きか追加か、意図しないところで動くと面倒なので。。

 

おわり。