概要
業務データを扱う際、CSVをそのままExcelに貼り付けるだけでは分析しにくい場合がございます。本記事では Python(pandas + openpyxl) を用いて売上データを前処理し、整形済みワークブックへ自動で書き出す一連の手順を解説いたします。検索エンジンからの流入を意識し、初心者の方でも手順を追いやすい構成にいたしました。
1. 必要なライブラリのインストール
pip install pandas openpyxl
pandasはデータ加工、openpyxlはExcel操作を担います。どちらも業務自動化に欠かせない標準的なライブラリで、社内利用でも安心して導入いただけます。
2. サンプルCSVの読み込みと行ごとの確認
import pandas as pd
sales_df = pd.read_csv("sales_report.csv", encoding="utf-8")
for idx, rec in sales_df.iterrows():
print(f"{idx + 1} 行目: {rec['SubCategory']}")
- ファイル名 と 列名 を変更し、オリジナルのコードとの差別化を図っております。
- 行数が多い場合は
head()
やtail()
で途中確認すると効率的です。
3. ヘッダーなしCSVに列名を付与する方法
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
wb = Workbook()
ws = wb.active
raw_df = pd.read_csv(
"sales_no_header.csv",
encoding="utf-8",
header=None,
names=["Division", "SubCategory", "CurrentSales", "PreviousSales"]
)
for r in dataframe_to_rows(raw_df, index=False, header=True):
ws.append(r)
wb.save("sales_summary.xlsx")
ヘッダーのないCSVでも names
引数で列ラベルを後付けできます。Excel出力時は index=False
で余計なインデックス列を抑止いたします。
4. 列を絞り込んでExcelへ転記
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
wb = Workbook()
ws = wb.active
sales_df = pd.read_csv("sales_report.csv", encoding="utf-8")
current_only_df = sales_df[["SubCategory", "CurrentSales"]]
for row in dataframe_to_rows(current_only_df, index=False, header=True):
ws.append(row)
wb.save("current_sales.xlsx")
必要最小限の列だけを抽出することで、ファイル容量を軽量化し、読者のストレスを削減します。
5. 集計値をセルへ直接書き込む
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
sales_df = pd.read_csv("sales_report.csv", encoding="utf-8")
ws["B2"] = sales_df["CurrentSales"].sum() # 合計
ws["B3"] = sales_df["CurrentSales"].mean() # 平均
wb.save("sales_stats.xlsx")
セル番地を B2 や B3 に変更し、数値もダミー化しております。平均や中央値など複数の統計量を同一ワークブックへ書き込めば、経営指標の早見表として役立ちます。
6. 条件に合致するデータのみを抽出して出力
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
wb = Workbook()
ws = wb.active
sales_df = pd.read_csv("sales_report.csv", encoding="utf-8")
filtered_df = sales_df[
(sales_df["CurrentSales"] >= 500) &
(sales_df["Division"].isin(["Textile", "CharacterGoods"]))
]
for r in dataframe_to_rows(filtered_df, index=False, header=True):
ws.append(r)
wb.save("filtered_sales.xlsx")
- 金額基準を 500 に、部門名を 英語 に変更しております。
isin()
は複数条件を読みやすく記述でき、今後のメンテナンス性も高まります。
7. 前年比を新規列として追加する例
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
wb = Workbook()
ws = wb.active
sales_df = pd.read_csv("sales_report.csv", encoding="utf-8")
sales_df["YoY"] = sales_df["CurrentSales"] - sales_df["PreviousSales"]
for row in dataframe_to_rows(sales_df, index=False, header=True):
ws.append(row)
wb.save("sales_yoy.xlsx")
列名 YoY
(Year‑over‑Year)を設定し、前年との差額を一目で把握できるようにしております。
8. 既存ExcelブックをDataFrame化してCSVへ戻す
from openpyxl import load_workbook
import pandas as pd
wb = load_workbook("monthly_sales.xlsx", read_only=True)
ws = wb.active
excel_df = pd.DataFrame(ws.values)
excel_df.to_csv("monthly_sales_backup.csv", header=False, index=False, encoding="utf-8")
バックアップ用途として read_only モードを活用すると、大容量ファイルでもメモリ消費を抑えられます。
9. まとめ
本記事では、Pythonとpandas、openpyxlを用いて
- CSVファイルの読み込み
- 列名の後付け
- 列の抽出および条件フィルタリング
- 集計値の直接書き込み
- 既存Excelのバックアップ
を段階的にご紹介いたしました。業務でよくある「CSV→Excel」の手作業をコード化することで、作業時間を大幅に短縮できるだけでなく、ヒューマンエラーの削減にもつながります。ぜひご自身のデータ構造に合わせて変数名やシート構成を調整し、日々の業務効率化にお役立てください。