やりたいこと・やり方
pandasのDataFrameにおいて、列の要素や行ごとにfor文を回すように処理したいことがあると思います。
そんな時はapply()を使えば良いと分かりました。
想定する場面
5人の学生が数学と英語のテストを受け、その合計点で合否判定を出す。
ソースコード
main.py
import pandas as pd
def absent_result(x):
"""未受験の場合は30点とする"""
if x == "未受験":
return 30
else:
return x
def calculate_total_score(row):
"""数学と英語の合計点を出す"""
return row['数学'] + row['英語']
def judge_pass_or_failure(x):
"""数学と英語の合計点が100点以上を合格、100点未満を不合格とする"""
if x >= 100:
return '合格'
else:
return '不合格'
if __name__ == "__main__":
# データ準備
name = ['田中', '伊藤', '鈴木', '加藤', '島田']
math_score = [70, 38, 25, 40, '未受験']
english_score = [90, 56, 44, 24, 89]
df = pd.DataFrame({
'名前': name,
'数学': math_score,
'英語': english_score
})
# 元データの出力
print("### 元データ ###")
print(df)
print("")
# 未受験者の処理
df['数学'] = df['数学'].apply(absent_result)
# 数学と英語の合計点の算出
df['合計点'] = df.apply(calculate_total_score, axis=1)
# 成績順に並び替え
df = df.sort_values('合計点', ascending=False)
# 合否判定
df['判定'] = df['合計点'].apply(judge_pass_or_failure)
print("### 最終結果 ###")
print(df)
出力結果
### 元データ ###
名前 数学 英語
0 田中 70 90
1 伊藤 38 56
2 鈴木 25 44
3 加藤 40 24
4 島田 未受験 89
### 最終結果 ###
名前 数学 英語 合計点 判定
0 田中 70 90 160 合格
4 島田 30 89 119 合格
1 伊藤 38 56 94 不合格
2 鈴木 25 44 69 不合格
3 加藤 40 24 64 不合格
おわりに
4本目の記事になりました。最後までご覧いただきありがとうございました!
感想やアドバイス、何でもコメントお待ちしています。