はじめに
Pandasのデータフレームで特定の列の値に対する平均値を計算し、計算した平均値の列を新たに追加するケースを見ていきます。
やりたいこと
最初に、以下のような各人のテスト結果を集計した表があるとします。
今回行いたいことは、各人の平均点を計算し、計算した平均点の列を新たに追加します。
そして、最終的に平均点を追加した新たな表を、Excelファイルとして出力します。
実施ポイント
-
平均点の計算をしたい列は、数学などの科目の点数が入った列のみです。
-
最初に読み込んだままのPandasのデータフレームの形で、単純に平均点を算出すると出席番号の列の値も含めた平均点が算出されてしまいます。
-
その為、平均点を算出する数学などの科目の列のみを最初に抜き出し、抜き出した列に対して平均点を算出します。そしてその後に、算出した平均点の列を、当初のデータフレームに合体させます。
実施方針
-
データ元となるExcelファイルを、Pandasでデータフレームとして読み込み
-
平均点の対象とする列(数学(点)、英語(点)、理科(点)、社会(点)、国語(点))を抜き出した新しいデータフレームを作成
-
新たに作成したデータフレームで各人の平均点数を算出
-
作成した平均点数の列を、元々のエクセルから読み込んだデータフレームに新しい列を作って合体させる。
-
Excelファイルとして出力する。
コード例
import pandas as pd
# Excelファイルをデータフレームとして読み込み
df = pd.read_excel(r"Excelファイル・パス")
# 平均点の対象とする列を抜き出した新しいデータフレームを作成
df_tensu = df[["数学(点)", "英語(点)", "理科(点)", "社会(点)", "国語(点)"]]
# 各人の平均点数を算出
df_kakuzin_heikin = df_tensu.mean(axis='columns')
# 作成した平均点数の列を、元々のエクセルから読み込んだデータフレームに新しい列を作って合体させる。
df["平均"] = df_kakuzin_heikin
# Excelファイルとして出力する。
df.to_excel(r'各人平均算出.xlsx', sheet_name='新規シート名')
コードのポイント
-
列を複数個抜き出す場合は、2重のリストになります。
# 平均点の対象とする列を抜き出した新しいデータフレームを作成 df_tensu = df[["数学(点)", "英語(点)", "理科(点)", "社会(点)", "国語(点)"]]
-
.mean()で平均を算出します。また、axis='columns' で列方向に平均値を算出することを明示しています。
# 各人の平均点数を算出 df_kakuzin_heikin = df_tensu.mean(axis='columns')
-
Excelファイルに出力する際のファイル名は、「各人平均算出.xlsx」。シート名は、「新規シート名」と指定しています。
# Excelファイルとして出力する。 df.to_excel(r'各人平均算出.xlsx', sheet_name='新規シート名')
コードの関数化
実際のコードに追加しやすいように、上記のコードを以下のように関数化しておきます。
import pandas as pd
def add_mean_clumn(input_file, target_clumn, output_file):
# 引数----------------------------------------
# input_file データ元となるファイルのパス(文字列)
# target_clum 計算対象とする列名(リスト)
# output_file 出力する際のファイル名(文字列)
# Excelファイルをデータフレームとして読み込み
df = pd.read_excel(input_file)
# 平均点の対象とする列を抜き出した新しいデータフレームを作成
df_tensu = df[target_clumn]
# 各人の平均点数を算出
df_kakuzin_heikin = df_tensu.mean(axis='columns')
# 作成した平均点数の列を、元々のエクセルから読み込んだデータフレームに新しい列を作って合体させる。
df["平均"] = df_kakuzin_heikin
# Excelファイルとして出力する。
df.to_excel(output_file, sheet_name='新規シート名')