この記事では、openpyxlライブラリを使ってExcelスプレッドシートからデータを読み込み、そのデータを集計・加工してPythonの辞書に格納し、最終的にその結果を再利用可能な.pyファイルとして書き出す、という一連のデータ処理パイプラインの構築方法を解説します。
1. 準備:サンプルExcelデータ
まず、sales_data.xlsxという名前でExcelファイルを作成し、Sheet1に以下のサンプルデータを入力してください。このデータをプログラムで集計します。
| A | B | C | D | |
| 1 | Region | City | ProductID | Sales |
| 2 | Kanto | Tokyo | A001 | 200 |
| 3 | Kansai | Osaka | B001 | 150 |
| 4 | Kanto | Tokyo | A002 | 300 |
| 5 | Kanto | Chiba | C001 | 100 |
| 6 | Kansai | Osaka | B002 | 250 |
| 7 | Kansai | Kyoto | D001 | 180 |
2. Excelデータの読み込みと集計処理
次に、このExcelファイルを読み込み、地域別・都市別に売上件数と合計売上を計算するスクリプトを作成します。
データ構造の設計 最終的に、以下のような入れ子辞書の形式でデータを集計します。 {'地域': {'都市': {'件数': x, '合計売上': y}}}
集計ループの実装 forループでExcelの各行を読み取り、setdefault()メソッドを巧みに使って、この入れ子辞書構造を動的に構築していきます。
import openpyxl
import pprint
print("ワークブックを開いています...")
workbook = openpyxl.load_workbook("sales_data.xlsx")
sheet = workbook['Sheet1'] # モダンな構文でシートを取得
# 集計データを格納するための空の辞書
aggregated_data = {}
print("行を読み込んで集計しています...")
# ヘッダー行をスキップするため、2行目から最終行までループ
for row in range(2, sheet.max_row + 1):
# 各列からデータを取得
region = sheet['A' + str(row)].value
city = sheet['B' + str(row)].value
sales = sheet['D' + str(row)].value
# setdefaultを使い、キーが存在しない場合のみ初期値を設定
aggregated_data.setdefault(region, {})
aggregated_data[region].setdefault(city, {'count': 0, 'total_sales': 0})
# 件数を1増やす
aggregated_data[region][city]['count'] += 1
# 合計売上を加算
aggregated_data[region][city]['total_sales'] += int(sales)
print("集計が完了しました。")
3. 集計結果を.pyファイルに書き出す
集計が完了したaggregated_data辞書を、後で簡単に再利用できるように、pprint.pformat()を使って整形された文字列に変換し、.pyファイルとして保存します。
print("結果をファイルに書き込み中...")
# with文を使って安全にファイルを開く
with open("sales_summary.py", "w", encoding='utf-8') as result_file:
# pprint.pformat()で辞書を整形された文字列に変換
formatted_data = pprint.pformat(aggregated_data)
result_file.write(f"all_data = {formatted_data}")
print("完了")
このスクリプトを実行すると、sales_summary.pyというファイルが作成され、その中にはall_dataという変数に集計結果の辞書が代入されたPythonコードが書き込まれます。
4. 保存したデータの利用
作成されたsales_summary.pyは、他のPythonスクリプトからモジュールとしてインポートして、集計済みデータに直接アクセスできます。
# 作成したデータファイルをインポート
import sales_summary
# データにアクセス
tokyo_sales = sales_summary.all_data['Kanto']['Tokyo']['total_sales']
print(f"東京の合計売上は {tokyo_sales} です。")
osaka_data = sales_summary.all_data['Kansai']['Osaka']
print(f"大阪のデータ: {osaka_data}")
実行結果:
東京の合計売上は 500 です。
大阪のデータ: {'count': 2, 'total_sales': 400}
まとめ
このプロジェクトは、openpyxlでExcelから生データを読み込み、辞書のsetdefaultメソッドを駆使してデータを集計し、pprint.pformatで結果を再利用可能な形式で出力するという、実用的なデータ処理の流れを示しています。一度集計処理を自動化すれば、元となるExcelファイルが更新されても、スクリプトを再実行するだけで常に最新の集計結果を得ることができます。
