PandasでExcelファイルに書き込む
今回は、Pandasを使ってExcelシートに書き込みをしたいと思います。
参考
作業環境
Windows10
Anaconda
Jupyter Notebook
Python3.7 (Pandasインストール済み)
スマホ(Android ソニー)
Qpython (python3 と pandasが動く)
目次
準備
Pandas.DataFrameをExcelシートに書き込むときに to_excel
を使います。
xlwt
というExcel書込み用と、Excel操作全般につかうopenpyxl
モジュールが必要なので先にインストールします。
xlwt
、openpyxl
をインストールします。
pip install xlwt
pip install openpyxl
Anacondaなら
conda install xlwt
conda install openpyxl
またはAnaconda Navigator のEnvironmentsからインストールします。
インストール後に確認で import openpyxl
してエラーがでなければOK。
だがしかし、importしなくても問題なく動くw
よくわかりませんが、エンジンが云々と公式に書かれている。そこで使っているらしい。
注意点
Excelブックを開いたまま
書込みのPythonスクリプトを実行
すると
PermissionError: Errno 13 Permission denied:
と権限のエラー
が出ます。
書込み確認後は、毎度ブックを閉じて
ください。
「おかしいな・・・またエラーか・・・」
と何度もやらかさないように(笑)
Pandas.to_excelで書き込み
カレントディレクトリの確認
今から書き込むExcelファイルは新規作成されて、カレントディレクトリに保存されます。
# カレントディレクトリの確認 import os print(os.getcwd())
DataFrameに値を入れる
import pandas as pd df = pd.DataFrame([["あ", "い", "う", "え", "お"], ["か", "き", "く", "け", "こ"], ["さ", "し", "す", "せ", "そ"]], index=['あ行', 'か行', 'さ行'], columns=['a', 'i', 'u', 'e', 'o']) print(df)
a i u e o
あ行 あ い う え お
か行 か き く け こ
さ行 さ し す せ そ
to_excel で書き込む
# Excelの保存ファイル名 file_name = 'pandas_to_excel.xlsx' # 書込み df.to_excel(file_name, sheet_name='あ行-さ行')
カレントディレクトリに「 pandas_to_excel.xlsx 」という名前のExcelファイルが新規作成されていると思います。
確認してましょう。
インデックスとヘッダーの周りの枠は自動で付いています。
pandas.to_excelの機能なのか分かりません。
確認が済んだら、次の書込みでエラーを出さないように
くどいようですが Excelのブックを閉じましょう!!
index と header をFalse 、sheet_name を消して書き込む
df.to_excel(file_name, index=False, header=False)
index と columns で指定した先頭の項目が消えて、上書き保存されました。
さらに、シート名もデフォルトの「Sheet1」に戻っています。
複数のシートに書き込む
ここでは pandas.ExcelWriter
を使っています。
参考
一番最初に用意した変数df
を「シート1」と「シート2」に書き込んでみます。
with pd.ExcelWriter(file_name) as writer: df.to_excel(writer, sheet_name='シート1') df.to_excel(writer, sheet_name='シート2')
異なるDataFrameを用意すれば異なる内容を複数のシートに書き込めます。
ブックに新規シートを追記
今までのは上書き保存でしたが、ここからは追記です。
別の内容のDataFrameを準備し、「シート3」に新規シートで書き込み、ブックに追加してみます。
mode
をa
に指定して追記モード
で新規シートを追記しています。
# 新規データ df_TaNa = pd.DataFrame([["た", "ち", "つ", "て", "と"], ["な", "に", "ぬ", "ね", "の"]], index=['た行', 'な行'], columns=['a', 'i', 'u', 'e', 'o']) # 追記モードで新規データを書き込み with pd.ExcelWriter(file_name, mode = 'a') as writer: df_TaNa.to_excel(writer, sheet_name='シート3')
全シート指定 sheet_name = None して read_excel で読み込む
df = pd.read_excel(file_name,sheet_name = None) print(df)
OrderedDict([('シート1', Unnamed: 0 a i u e o
0 あ行 あ い う え お
1 か行 か き く け こ
2 さ行 さ し す せ そ), ('シート2', Unnamed: 0 a i u e o
0 あ行 あ い う え お
1 か行 か き く け こ
2 さ行 さ し す せ そ), ('シート3', Unnamed: 0 a i u e o
0 た行 た ち つ て と
1 な行 な に ぬ ね の), ('シート31', Unnamed: 0 a i u e o
0 た行 た ち つ て と
1 な行 な に ぬ ね の), ('シート32', Unnamed: 0 a i u e o
0 た行 た ち つ て と
1 な行 な に ぬ ね の), ('シート33', Unnamed: 0 a i u e o
0 た行 た ち つ て と
1 な行 な に ぬ ね の)])
↑ はJupyter Notebookの実行結果です。
追記モードで書いたコードセルを実行する度に、同じ内容のしーとがブックに追記されていきます。
追加されるシート名は 「シート3」→ 「シート31」 → 「シート32」と自動で割り振られました。
10回超えると「シート310」「シート311」のように桁が上がりました。
Qpythonでできるか確認
Qpythonでpandasがインストールされている状態からスタートしますよ。
スタート画面のQPYPIから
pip install xlrd
pip install xlwt
pip install openpyxl
をインストールします。
Qpythonのエディタでコード書いて
↓↓↓
実行
↓↓↓
↑↑↑↑
DataFrameの標準出力させたところ。
書き込みしたファイルはデフォルトでqpythonフォルダに保存される。
今回はここまで。
ありがとうございました。