[pandas] 条件に合った行のみを編集したいとき、locメソッドを使うと簡単にできる件

したいこと

太郎、次郎、三郎、四郎、五郎がテストを受け、成績はそれぞれ以下の通りでした。

名前 (name) 点数 (score)
太郎 (Taro) 300
次郎 (Jiro) 250
三郎 (Saburo) 80
四郎 (Shiro) 200
五郎 (Goro) 270

このDataFrameを使って以下のことをしたいとします。

  1. 100点以上を合格に、100点未満を不合格にしたい。
  2. 成績によって3ランクに分けたい。 (250点以上をAランク、100点未満をCランク、それ例外をBランク)

いきなり結論のコード

サクッと動作確認コーナー

  • 下にある実行ボタンで動作確認できます。
  • コードを書き換えることもできます。
  • コードを元に戻したい場合は、このページをリロードして下さい。

ケース1: 100点以上を合格に、100点未満を不合格にしたい場合

ケース2: 成績によって3ランクに分けたい場合

コード全容

ケース1: 100点以上を合格に、100点未満を不合格にしたい場合

import pandas as pd

df = pd.DataFrame({
    'name': ['Taro', 'Jiro', 'Saburo', 'Shiro', 'Goro'],
    'score': [90, 80, 30, 50, 60]
})

# 40点以上を合格に、40点未満を不合格にする
df.loc[df['score'] >= 40, 'result'] = '合格'
df.loc[df['score'] < 40, 'result'] = '不合格'

print(df)

ケース2: 成績によって3ランクに分けたい場合

import pandas as pd

df = pd.DataFrame({
    'name': ['Taro', 'Jiro', 'Saburo', 'Shiro', 'Goro'],
    'score': [90, 80, 30, 50, 60]
})

# 80点以上をAランク、40点未満をCランク、その間をBランクにする
df.loc[df['score'] >= 80, 'result'] = 'Aランク'
df.loc[(df['score'] < 80) & (df['score'] >= 40), 'result'] = 'Bランク'
df.loc[df['score'] < 40, 'result'] = 'Cランク'

print(df)

解説

それでは簡単に解説していきます。

df.loc[df['score'] >= 40, 'result'] = '合格'

こういった方法で、条件に一致する行の指定カラムに、値をいれることができます。
ここでは、scoreが40以上のresultカラムに合格という文字列を格納しています。
是非、サクッと動作確認コーナーで、色々といじってみて下さい。

また、複数の条件で絞り込みたい場合は、以下のように書けます。

df.loc[(df['score'] < 80) & (df['score'] >= 40), 'result'] = 'Bランク'

()でくくって&で指定するだけです。
この&|にすれば、ORで指定することもできます。

さいごに

今日は、DataFrameで条件に合った行のみを編集する方法について、記事にしました。
DataFrameは色々な書き方があるので、もっと簡単にかける方法があるよってことであれば、Twitter等からご連絡頂けると嬉しいです!
最後まで読んで頂き、ありがとうございました。

PON3

PON3

5年くらい前に、30代完全未経験から独学でWeb系のソフトウェアエンジニアになった人。 現在はフリーランスエンジニアとして、大阪の自宅からフルリモートで東京の自社開発企業のお仕事をしている。 主戦場はバックエンドで、Go言語でのAPI開発や、Pythonでのデータ分析が武器。 とは言いつつ、フロントエンドをSPAを実装したり、IaCでクラウドインフラの設計構築したり、スクラム開発でプロジェクト運営したりするなんでも屋。 いつも、ググってきては誰かが書いてくれた記事を見て開発していたが、もらってばかりでなく世の中に返すこともしたいと思い、技術ブログをはじめる。 妻と2歳になる娘の3人暮らし。 何かご用件がある方は、TwitterのDMからどうぞ。