全体まとめページは↓より。
やりたいこと
カテゴリ変数を集計して、その合計値を新しい列に転記する。
今回は「暑さ」をカテゴリごとに集計する。
フォルダ構成
VSCodeで実行するときはprg配下を開いてpyファイルを作り実行する。
実装
★部分が今回のポイント。
集計列をまずはソートして、キーブレイクの考え方で集計していく。
import os
import openpyxl
from operator import itemgetter
#辞書リストの作成関数
def make_shipment(sh):
shipment_list = []
for row in sh.iter_rows():
if row[0].row == 1:
header_cells = row
else:
row_dic = {}
for v, k in zip(header_cells, row):
row_dic[v.value] = k.value
shipment_list.append(row_dic)
return shipment_list
#ファイル名を入力させる
print("ファイル名を入力:")
filename = input()
#読み込みファイルパスを作成
infile_path = os.path.join("..\indata" , filename)
#読み込みファイルからオブジェクトを生成
iwb = openpyxl.load_workbook(infile_path)
ish = iwb.active
#出力ファイルオブジェクトを生成
owb = openpyxl.Workbook()
osh = owb.active
#出力ファイルパスを作成
outfile_path = os.path.join("..\outdata", filename)
#辞書リストを作成
shipment_list = make_shipment(ish)
#★集計したい列でソートする
sorted_list = sorted(shipment_list,key=itemgetter("暑さ"))
#転記先ヘッダ処理
list_row = 1
osh.cell(list_row,1).value = "index"
osh.cell(list_row,2).value = "気温"
osh.cell(list_row,3).value = "暑さ"
osh.cell(list_row,4).value = "集計値"
#★キーが同じなら集計値を加算していき、キーが異なったら
# 集計値を確定して集計列に転記する
old_key = ""
sum_key = 0
list_row = 1
for dic in sorted_list:
list_row += 1
if old_key == "":
old_key = dic["暑さ"] #最初のold_keyを格納する
if old_key != dic["暑さ"]:
old_key = dic["暑さ"]
osh.cell(list_row-1,4).value = sum_key #新しいキーの行で数値が確定するので、行のセル番地を-1する
sum_key = 1 #集計値を初期化する。処理行ですでに1つあるので初期値は1。
else:
sum_key += 1
if list_row == len(sorted_list)+1: #最終行の判定は0開始なのでlen+1にする
osh.cell(list_row,4).value = sum_key #最後の集計項目の処理
#転記処理
list_row = 1
for dic in sorted_list:
list_row += 1
osh.cell(list_row,1).value = dic["index"]
osh.cell(list_row,2).value = dic["気温"]
osh.cell(list_row,3).value = dic["暑さ"]
#ファイルを保存
owb.save(outfile_path)
出力結果
「集計値」列が追加され、それぞれのカテゴリの最後の行に集計値が転記されている。
以上