PythonでPandasライブラリを使ったExcel(XLSX)ファイルの読み書き

他のすべての種類のファイルと同様に、Python を使用して Excel ファイルの読み取りと書き込みを行うために Pandas ライブラリを使用することができます。このチュートリアルでは、ExcelファイルをDataFrameを使って読み書きする方法を説明します。

単純な読み書きに加えて、複数の DataFrame を Excel ファイルに書き込む方法、スプレッドシートから特定の行や列を読み込む方法、ファイル内の単一シートや複数シートに名前を付けてから何かを行う方法について学びます。

また、他の種類のファイルについても学びたい方は、こちらをご覧ください。

  • PythonでPandasを使ったJSONファイルの読み書き
  • Pandasを使ったPythonでのCSVファイルの読み書き

PythonでPandasを使ったExcelファイルの読み書きを紹介します。

当然ながら、Pandasを使うにはまずインストールする必要があります。最も簡単な方法は pip 経由でインストールすることです。

Windowsであれば

$ python pip install pandas


LinuxやMacOSを使用している場合。

$ pip install pandas


この記事のコードを実行すると、ModuleNotFoundErrorImportError というエラーが発生するかもしれないので注意してください。例えば

ModuleNotFoundError: No module named 'openpyxl'


このような場合は、足りないモジュールをインストールする必要があります。

$ pip install openpyxl xlsxwriter xlrd


Pandasを使ったExcelファイルの書き方

Excel ファイルに書き込みたい情報を DataFrame に格納することにします。ビルトインの to_excel() 関数を使って、この情報を Excel ファイルに展開します。

まず、Pandasモジュールをインポートしましょう。

import pandas as pd


では、辞書を使って DataFrame に情報を入力してみましょう。

df = pd.DataFrame({'States':['California', 'Florida', 'Montana', 'Colorodo', 'Washington', 'Virginia'],
    'Capitals':['Sacramento', 'Tallahassee', 'Helena', 'Denver', 'Olympia', 'Richmond'],
    'Population':['508529', '193551', '32315', '619968', '52555', '227032']})


辞書のキーは列の名前になります。同様に、値は情報を含む行になります。

次に、to_excel() 関数を使って、その内容をファイルに書き出します。引数はファイルパスだけです。

df.to_excel('./states.xlsx')


作成されたExcelファイルは以下のとおりです。

この例では、パラメータを使用していないことに注意してください。したがって、ファイル内のシートはデフォルトの名前である「Sheet 1」のままです。このExcelファイルには、数字を含む列が追加されていることがわかります。これらの数値は各行のインデックスであり、Pandasの DataFrame から直接取得したものです。

sheet_nameパラメータをto_excel()` の呼び出しに追加することで、シートの名前を変更することができます。

df.to_excel('./states.xlsx', sheet_name='States')


同様に、index パラメータを追加して False に設定すると、出力からインデックスカラムを削除することができます。

df.to_excel('./states.xlsx', sheet_name='States', index=False)


さて、Excelファイルは次のようになります。

複数のデータフレームをExcelファイルに書き出す

複数のデータフレームをExcelファイルに書き出すことも可能です。その場合、データフレームごとに異なるシートを設定することもできます。

income1 = pd.DataFrame({'Names': ['Stephen', 'Camilla', 'Tom'],
                   'Salary':[100000, 70000, 60000]})


income2 = pd.DataFrame({'Names': ['Pete', 'April', 'Marty'],
                   'Salary':[120000, 110000, 50000]})


income3 = pd.DataFrame({'Names': ['Victor', 'Victoria', 'Jennifer'],
                   'Salary':[75000, 90000, 40000]})


income_sheets = {'Group1': income1, 'Group2': income2, 'Group3': income3}
writer = pd.ExcelWriter('./income.xlsx', engine='xlsxwriter')


for sheet_name in income_sheets.keys():
    income_sheets[sheet_name].to_excel(writer, sheet_name=sheet_name, index=False)


writer.save()


ここでは、従業員の名前と給料をデータとして含む3つのデータフレームを作成しました。これらのデータフレームには、それぞれ辞書が設定されています。

この3つを income_sheets 変数で結合し、各キーはシート名、各値は DataFrame オブジェクトとしました。

最後に、xlsxwriter エンジンを使用して writer オブジェクトを作成しました。このオブジェクトは to_excel() 関数呼び出しに渡されます。

何も書き込まないうちに、income のキーをループして、それぞれのキーに対して、それぞれのシート名に内容を書き込んでいます。

以下は、生成されたファイルです。

このExcelファイルには、グループ1、グループ2、グループ3`という3つのシートがあることがわかると思います。これらのシートには、従業員の名前とその給料が、コードの3つの異なるデータフレームにある日付と関係づけられています。

関数 to_excel() の engine パラメータは、Pandas ライブラリが Excel ファイルを作成するためにどの基礎モジュールを使用するかを指定するために使用されます。この例では、 xlsxwriter モジュールが ExcelWriter クラスのエンジンとして使用されます。それぞれの機能に応じて、異なるエンジンを指定することができます。

システムにインストールされているPythonモジュールによって、engine属性の他のオプションは以下のようになります。openpyxl(xlsxxlsmの場合) とxlwt(xls` の場合) です。

xlsxwriter` モジュールを Pandas ライブラリで使用する際の詳細については、公式ドキュメントを参照してください。

最後になりましたが、上記のコードでは writer.save() を用いて明示的にファイルを保存する必要があります、さもなければディスクに保存されません。

PandasでExcelファイルを読み込む

Excel ファイルに DataFrame オブジェクトを書き込むのとは対照的に、Excel ファイルを DataFrame に読み込むという逆のこともできます。Excel ファイルの内容を DataFrame に格納するのは、read_excel() 関数を呼び出すだけで、簡単にできます。

students_grades = pd.read_excel('./grades.xlsx')
students_grades.head()


この例では、このExcelファイルを読み込んでいます。

ここで、必要な引数はExcelファイルへのパスだけです。内容は読み込まれて DataFrame にまとめられ、 head() 関数でプレビューできるようになります。

注意: この方法は、最も単純な方法ですが、最初のシートしか読み込みません。

それでは、head()関数の出力を見てみましょう。

Pandas は read_excel() 関数を使用すると、デフォルトで DataFrame に行ラベルまたは数値インデックスを割り当てます。

index_col` パラメータに Excel ファイルのカラムを渡すことで、デフォルトのインデックスをオーバーライドすることができます。

students_grades = pd.read_excel('./grades.xlsx', sheet_name='Grades', index_col='Grade')
students_grades.head()


このコードを実行すると、次のようになります。

上記の例では、デフォルトのインデックスを Excel ファイルの「Grade」カラムに置き換えています。しかし、より良いインデックスとして機能する値を持つ列がある場合のみ、デフォルトインデックスをオーバーライドする必要があります。

Excelファイルから特定の列を読み取る

ファイル全体を読み込むことは便利ですが、多くの場合、特定の要素にアクセスしたいと思うでしょう。例えば、要素の値を読み取って、それをオブジェクトのフィールドに代入したい場合です。

この場合も read_excel() 関数を使用しますが、ここでは usecols パラメータを渡します。例えば、特定のカラムだけを読み込むように関数を制限することができます。ここでは、”Student Name”, “Grade”, “Marks Obtained” の値に対応するカラムを読み込むように、パラメータを追加してみましょう。

各カラムのインデックスを数値で指定することで、これを実現します。

cols = [0, 1, 3]


students_grades = pd.read_excel('./grades.xlsx', usecols=cols)
students_grades.head()


このコードを実行すると、次の結果が得られます。

見ての通り、colsリストで指定されたカラムのみを取得しています。

結論

Pandas ライブラリの read_excel()to_excel() 関数の一般的な使用方法を説明しました。これらの関数を使って、既存のExcelファイルを読み、独自のデータを書きました。

様々なパラメータを使用することで、これらの関数の動作を変更することができ、単に DataFrame から全てをダンプするのではなく、カスタマイズされたファイルを構築することができます。

タイトルとURLをコピーしました