😎

PandasでExcelファイルを読み書きしてみよう!

に公開

Pythonを使ってExcelファイルを読み書きする方法

Pythonを使ってExcelファイルを操作することができます。
それによって、複数のExcelファイルから必要なデータだけを抽出したり、それを一つのExcelファイルとして出力することもできます。
Pythonを使ってExcelファイルを読み書きする方法は、Pandasというモジュールを使用する方法が簡単です。

前提

PycharmというIDE(統合開発環境)でプログラミングを実装します。
もし、本記事と同じ内容でプログラミングを組んでみたい場合は、公式サイトからダウンロードをお願いします。

モジュールとは?

色々なクラスや関数をひとまとめにしたもの。必要に応じて環境にインストールすることで、様々な機能を使えます。
モジュールを使わずに、Excelファイルを読み書きしようとすると、複雑な実装となり、コード量も多くなってしまいます。効率的に目標を達成するために、ぜひモジュールは使ってみましょう!

Pandasとは?

モジュールであるPandasは、データを柔軟に加工することができ、CSVファイルやExcelファイルなどを読み書きすることができます。
CSVファイルやExcelファイル以外にも、機械学習におけるデータの前処理にも使われたりしますが、この記事ではExcelファイルを操作する点に絞って解説します。

Pandasの使い方

Pandasの使い方はとても簡単です。pythonのソースの先頭でimport文として宣言するだけです。

import モジュール名
import モジュール名 as 別名 

import pandas as pd

PycharmでPandasを利用する方法

PycharmでPandasを利用したい場合は、以下の手順で使うことができます。

設定 > Pythonインタープリター > + ボタンで対象のモジュールをローカル環境にインストール

https://youtu.be/euUswmQwsJE
Pandasの他にopenpyxlモジュールもインストールしておく。

Excelファイルの読み込み

pd.read_excel('ファイルパス')で、対象のファイルを読み込むことができます。

import pandas as pd
# カレントディレクトリのexcelsフォルダの中のsato.xlsxを読み込む
df = pd.read_excel('./excels/sato.xlsx')
print(df)
出力結果

日にち 労働時間
0 2022-01-01 0
1 2022-01-02 7
2 2022-01-03 10
3 2022-01-04 8
4 2022-01-05 5
5 2022-01-06 4
6 2022-01-07 3
7 2022-01-08 6
8 2022-01-09 1
9 2022-01-10 4
10 2022-01-11 1
11 2022-01-12 1
12 2022-01-13 9
13 2022-01-14 0
14 2022-01-15 9
15 2022-01-16 8
16 2022-01-17 10
17 2022-01-18 9
18 2022-01-19 2
19 2022-01-20 3
20 2022-01-21 4
21 2022-01-22 2
22 2022-01-23 3
23 2022-01-24 5
24 2022-01-25 5
25 2022-01-26 6
26 2022-01-27 9
27 2022-01-28 4
28 2022-01-29 6
29 2022-01-30 5
30 2022-01-31 4

read_excel()の引数でファイルパスだけを指定した場合、当該Excelの最初のシートを読む込む。
もし、特定のシートだけを読み込みたい場合は、sheet_nameの引数を指定する。

# sato.xlsxの「202202」シートを読み込む
df = pd.read_excel('./excels/sato.xlsx', sheet_name='202202')
print(df)

全部のシートのデータを読み込みたい場合は、sheet_nameの引数にNoneを指定する。

# 全てのシートを取得
df = pd.read_excel('./excels/sato.xlsx', sheet_name=None)
# df.keys()でvalueに対応するkeyを取得することができる
print(df.keys())
出力結果

dict_keys(['202201', '202202', '202203', '202204'])

df.query()で対象のデータにフィルターを掛けて、データを抽出することもできます。

all_df = pd.read_excel('./excels/sato.xlsx', sheet_name=None)
overwork_list = []
for sheet in all_df.keys():
    # 労働時間が8時間を超えているデータだけを抽出
    df_overwork = all_df[sheet].query('労働時間 > 8')
    overwork_list.append(df_overwork)

# pd.concat()でリストデータを一つのDataFrame(行と列からなるデータ形式)にまとめることができる
df = pd.concat(overwork_list)
print(df)
出力結果

労働時間が8時間を超えているデータしか存在しない

日にち 労働時間
2 2022-01-03 10
12 2022-01-13 9
14 2022-01-15 9
16 2022-01-17 10
17 2022-01-18 9
26 2022-01-27 9
2 2022-02-03 9
12 2022-02-13 9
19 2022-02-20 9
24 2022-02-25 9
3 2022-03-04 10
12 2022-03-13 9
18 2022-03-19 9
19 2022-03-20 9
24 2022-03-25 10
26 2022-03-27 9
0 2022-04-01 9
3 2022-04-04 9
7 2022-04-08 9
19 2022-04-20 10
24 2022-04-25 9
27 2022-04-28 9
28 2022-04-29 10

Excelファイルの書き込み

df.to_excel('ファイルパス')で、対象のデータをExcelとして出力することができます。

all_df = pd.read_excel('./excels/sato.xlsx', sheet_name=None)
overwork_list = []
for sheet in all_df.keys():
    df_overwork = all_df[sheet].query('労働時間 > 8')
    overwork_list.append(df_overwork)

df = pd.concat(overwork_list)
# 佐藤さんの超過労働時間のデータを、sato_overwork.xlsxとして出力させる
df.to_excel('sato_overwork.xlsx', sheet_name='sato_total')

pd.ExcelWriterで複数のシートに、それぞれのPandasのデータを出力することもできます

def concat_overwork(file_name):
    all_df = pd.read_excel(file_name, sheet_name=None)
    overwork_list = []
    for sheet in all_df.keys():
        df_overwork = all_df[sheet].query('労働時間 > 8')
        overwork_list.append(df_overwork)

    df = pd.concat(overwork_list)
    return df


df_sato = concat_overwork('./excels/sato.xlsx')
df_suzuki = concat_overwork('./excels/suzuki.xlsx')

# sato_and_suzuki.xlsxに、佐藤さんと鈴木さんの超過労働時間のデータを別々のシートとして出力
with pd.ExcelWriter('sato_and_suzuki.xlsx') as writer:
    df_sato.to_excel(writer, sheet_name='sato')
    df_suzuki.to_excel(writer, sheet_name='suzuki')

課題

pandasを使ったExcelファイルの読み書きについて学習してきました。
ここまで学んできた内容を使って、最後に課題に取り組んでみましょう!

まずは自分で取り組んでみて、それでも分からなければ、ヒントを見てみましょう!
自分でプログラミングを実装できるまで、解答は見ないように。

ヒント①

ExcelWriterを使って、複数のシートに一括書き出しができます

with pd.ExcelWriter(output_file) as writer:
    df.to_excel(writer, sheet_name=sheet_name_1)
    df.to_excel(writer, sheet_name=sheet_name_2)

ヒント②

Path.glob()を使って、複数Excelファイルのパスを取得できる

input_folder = Path('./excels')
for excel_file in input_folder.glob('*.xls*'):
    df = pd.read_excel(excel_file, sheet_name=sheet_name)

最後に

最後まで読んでいただきありがとうございます。
このようなPython記事やモバイルアプリ開発の記事を投稿する予定ですので、もしよかったら、次の投稿も見ていただいたら幸いです!

よろしくお願いします。

Discussion