PythonでExcel操作:【Ver2】カテゴリ変数データの集計値を転記する

勉強系(Python/Excel/統計学/その他)

全体まとめページは↓より。

やりたいこと

カテゴリ変数を集計して、その合計値を新しい列に転記する。
今回は「暑さ」をカテゴリごとに集計する。

Ver1は↓より。

フォルダ構成

VSCodeで実行するときはprg配下を開いてpyファイルを作り実行する。

実装

★部分が今回のポイント。
集計処理を関数化して本処理を簡素化している。
2次元辞書データである元データ部と集計列の結合は難しそうなので、転記処理は別々に行う。

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

#★集計関数
#キーが同じなら集計値を加算していき、キーが異なったら
#集計値を確定して集計列に転記する
#引数
#1.shipment_list: 辞書リスト
#2.category: 集計するカテゴリ変数名
#3.colno: 集計値を転記する列番号
def sum_category(sorted_list,category,colno):
    old_key = ""
    sum_key = 0
    list_row = 1
    for dic in sorted_list:
        list_row += 1
        if old_key == "":
            old_key = dic[category] #最初のold_keyを格納する

        if old_key != dic[category]:
            old_key = dic[category]
            osh.cell(list_row-1,colno).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,colno).value = sum_key #最後の集計項目の処理

#項目リスト
collist = ["index","気温","暑さ"]

#ファイル名を入力させる
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("暑さ"))

#転記先ヘッダ処理
for col in range(len(collist)):
    osh.cell(1,col+1).value = collist[col]

#転記処理
list_row = 1
for dic in sorted_list:
    list_row += 1
    for col in range(len(collist)):
        colname = collist[col]
        osh.cell(list_row,col+1).value = dic[colname]
        col += 1

#集計列のヘッダ処理
osh.cell(1,len(collist)+1).value = "暑さ合計"

#集計列転記処理
sum_category(sorted_list,"暑さ",4)

#出力ファイルを保存
owb.save(outfile_path)

出力結果

「集計値」列が追加され、それぞれのカテゴリの最後の行に集計値が転記されている。

以上

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