7
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

pythonにてpandas.DataFrameをExcelにシート別に保存する

Last updated at Posted at 2020-08-16

pd.to_excelで困った...

現在株価の分析を行っているのですが、その際dataframeを使用しています。しかし、様々な条件で分析を行った後、他人に説明などを行う場合Excelファイルとして保存しておくのが良いと思いました。しかし、pandasのto_excelを用いようとすると、新たにデータを書き込みたい場合上書きされてしまいます。これは困った...

そこでいろいろ調べていくとopenpyxlと組み合わせるとなんとか上書きされずに保存できることがわかりました。そこで備忘録としてそのコードを残しておきたいと思います。

使用したパッケージなどのバージョンは以下の通りです。

Python 3.7
Pandas 0.25.1
openpyxl 3.0.0

excelへの保存

新規のワークブック、ワークシートに保存する

この場合はpandasのto_excelを使いましょう。

to_excel.py
import pandas as pd

with pd.ExcelWriter(file_path) as writer:
    df.to_excel(writer, sheet_name=sheet_name)

##既存のワークブック、ワークシートに上書きする

この場合はopenpyxlを使って、上書きしましょう。

to_excel.py
import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows


wb = openpyxl.load_workbook(file_path)

ws = wb[sheet_name]

for i, row in enumerate(dataframe_to_rows(df, header=False)):
    if i == 0:
        continue
    ws.append(row)
wb.save(file_path)

##既存のワークブックに新規のシートとして保存する

この部分がこの記事での肝の部分で、調べまくったところです...

to_excel.py
import openpyxl
from openpyxl.utils.dataframe import dataframe_to_rows


wb = openpyxl.load_workbook(file_path)

ws = wb.create_sheet(title=sheet_name)
ws.append(['Date', 'Open', 'Close', 'High', 'Low'])

for i, row in enumerate(dataframe_to_rows(df, header=False)):
    if i == 0:
        continue
    ws.append(row)
wb.save(file_path)

後半は既存のワークブック、ワークシートに保存する場合と同じです。

#まとめ
以上がそれぞれの書き方です。
僕自身は2番目と3番目はtry-exceptで書きましたが、たぶんif文でのわかりやすい分け方もあるのかな〜と...

また新しいやり方が見つかったら追記なり、新しい記事で書き込みたいと思います!
では!

7
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?