openpyxlでエクセルファイルを編集しているんだけど、
A列に入っている値の平均値を出したい…。
なるほど…。
では今回は、「openpyxlで特定の列の平均値を算出する方法」を
できるだけわかりやすく解説いたします。
openpyxlで特定の列の平均値を算出する方法
for文で値を配列に入れ、「sum」と「len」を使って算出します。
まずは全コードと実行結果をお見せします。
解説は後ほど行います。
全コード
A列に入った値の平均値をB1に書き出す見本です。
少し長いですが、後ほど各ブロックごとに解説いたします。
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
values = []
for cell in ws['A']:
if isinstance(cell.value, (int, float)):
values.append(cell.value)
if values:
average = sum(values) / len(values)
else:
average = 0
ws['B1'] = average
wb.save('C:/Utatane/output.xlsx')
for cell in ws['A']:
if isinstance(cell.value, (int, float)):
values.append(cell.value)
if values:
average = sum(values) / len(values)
else:
average = 0
実行結果
事前準備
- openpyxlのインストール
既存のエクセルファイルを編集するには「openpyxl」のインストールが必要です。
openpyxlのインストール方法
openpyxlを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install openpyxl
※openpyxlを使用したことがある場合は、このインストール作業は不要です。
インストールに関する詳細や、インストールができなかった場合の対処法は下記記事で解説しております。
また、既存ファイルを開いて保存する方法など、基本解説も行っておりますのでご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
インポート~ブック・シートの取得
import openpyxl
wb = openpyxl.load_workbook('C:/Utatane/input.xlsx')
ws = wb['Sheet1']
上記コードにて、エクセル操作に必要な「openpyxl」のインポートと、エクセルブック・シートを取得しています。
詳細は、「インストール方法」の記事をご参考ください。
空の配列を作成
values = []
上記コードにて、空の配列を作成しています。
配列についての詳細は、下記記事をご参考ください。
A列の値を配列に格納
for cell in ws['A']:
if isinstance(cell.value, (int, float)):
values.append(cell.value)
上記コードにて、A列の値を配列に格納しています。
for文を使ってA1・A2・A3という具合に、A列の値を一つずつ配列に入れていっています。
for文についての詳細は、下記記事をご参考ください。
if isinstance(cell.value, (int, float)):
values.append(cell.value)
9・10行目では、if文を使ってA列の各値が数値かどうかを判断し、数値なら配列に追加するという処理をしています。
数値でなければ弾かれ、配列には入りません。
数値以外のものが混ざると計算できないため、このような処理をしています。
if文については、下記記事をご参考ください。
「isinstance()」で変数の型を判断しています。
今回は数値かどうかを判断したいので、「int(整数)」か「float(小数点あり)」の指定をしています。
セルの値が数値(intかfloat)なら、9行目のコードが実行されます。
9行目は、配列に変数(今回であればA1やA2などの値)を追加するという処理です。
なので8~10行目で下記のような処理が行われます。
- まずはA1セルの値が数値かを判断
- 数値なら配列に追加、数値以外なら弾く
- 次はA2・次はA3とA列の最後まで同じ処理を繰り返す
10行目が終わった段階では、配列「values」は下記のような状態になります。
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
平均値を算出
if values:
average = sum(values) / len(values)
else:
average = 0
上記コードにて、配列「values」の平均値を算出しています。
ifのところはひとまず忘れて、13行目だけを見てください。
平均値の計算方法は「合計値 / 要素数」です。
「sum(配列名)」と記述することで、配列内の数値の合計値を算出できます(今回は55)
同様に「len(配列名)」と記述すると、配列内の要素数がわかります(今回は10)
あとはこれらを上記の式に当てはめて計算するだけです。
【 平均値を格納するための変数(今回はaverage) = sum(配列名) / len(配列名) 】
ifは保険です。配列「values」に値がなにも入ってない場合、エラーが発生してプログラムが止まってしまいます。
エラーが出ないように、配列「values」に値が無かった場合は「else」である「average = 0」を実行するようにしています。
「if~else」については、下記記事をご参考ください。
あとは「average」をB1セルに書き込みするだけです。
では、計算がキチンとできていることを確認するために、A列の値を1つ減らしてみましょう。
再び実行してみます。
平均値も変わりました。
うまく動作しない場合の対処法
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
Permission denied: ○○
操作しようとしているファイルにアクセスできないというエラーです。
「ファイルを開いている状態なので編集できない」と言っていることが多いので、開いていれば閉じて再度トライしましょう。
詳しい解説は、下記記事をご参考ください。
Worksheet ○○ does not exist
「指定したシートがありません」というエラーです。
指定のシート名が間違っていないか、「sheet1」など先頭が小文字になっていないか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
openpyxlで特定の列の平均値を算出する方法を解説いたしました。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!