PythonでDataFrameから成績が「A」の生徒の名前を抽出する方法
pandasのDataFrameから特定の条件に一致する行だけを取り出すことは、データ分析における最も基本的な操作の一つです。この記事では、「Id」「Name」「Grade」の3列を持つ生徒データのDataFrameから、成績(Grade)が「A」の生徒の名前のみを抽出するプログラムを、ブールインデックス参照を使って実装する方法を解説します。
入力データと期待される出力
まず、以下のようなDataFrameを想定します。
Id Name Grade 0 1 stud1 A 1 2 stud2 B 2 3 stud3 C 3 4 stud4 A 4 5 stud5 A
このDataFrameから成績が「A」の生徒の名前を抽出すると、次の結果が得られます。
0 stud1 3 stud4 4 stud5
解決のアプローチ
この問題は、以下の手順で解決できます。
生徒データを含むDataFrameを定義する
Grade列の値と「A」を比較し、条件に一致するかどうかの真偽値(マスク)を作成する
そのマスクをDataFrameに渡して該当行だけを抽出し、Name列を取得する
具体的には、比較演算の結果をそのままインデックスとして渡す、次のような記述を使用します。
df[df['Grade']=='A']
df['Grade']=='A' の部分は、各行に対して成績が「A」なら True、そうでなければ False を返します。これを df[ ] の中に入れることで、True の行だけが残ります。
コード例
実際の実装例を見てみましょう。
import pandas as pd
data = [[1,'stud1','A'],[2,'stud2','B'],[3,'stud3','C'],[4,'stud4','A'],[5,'stud5','A']]
df = pd.DataFrame(data, columns=('Id','Name','Grade'))
print("DataFrame is\n", df)
print("find the A grade students name\n")
result = df[df['Grade']=='A']
print(result['Name'])
実行結果
DataFrame is Id Name Grade 0 1 stud1 A 1 2 stud2 B 2 3 stud3 C 3 4 stud4 A 4 5 stud5 A find the A grade students name 0 stud1 3 stud4 4 stud5 Name: Name, dtype: object
インデックス番号0、3、4の行、つまり「stud1」「stud4」「stud5」という成績「A」の生徒の名前だけが出力されました。Seriesとして取得されているため、末尾に Name: Name, dtype: object という情報も表示されています。
別の方法:query()メソッドを使う
pandasでは、文字列で条件式を指定できる query() メソッドを使うこともできます。こちらの方が直感的で読みやすいコードになる場合があります。
result = df.query("Grade == 'A'")
print(result['Name'])
どちらの方法でも同じ結果が得られますので、状況や好みに応じて使い分けるとよいでしょう。
-
【Python】PandasのSeriesから特定の範囲の要素を抽出して表示する方法
はじめにデータ分析では、PandasのSeriesから特定の範囲に含まれる値だけを取り出したい場面がよくあります。本記事では、「10以上15以下」の要素を抽出して表示するプログラムを、2つの異なるアプローチで実装する方法を解説します。入力 − 次のようなSeriesがあるとします。0 12 1 13 2 15 3 20 4 19 5 18 6 11出力 − 10から15の範囲にある要素を抽出すると、結果は次のようになります。0 12 1 13 2 15 6 11解決策1:between()メソッドを使うPandasには、指定した
-
Pythonでひし形を描画・出力するプログラムの書き方
Pythonのループ処理(繰り返し構文)を活用すると、キーボードのさまざまな文字を使って、整形された図形を簡単に作成できます。その一例が「ひし形(ダイヤモンド形)」です。ひし形の出力には複数のループが必要になります。なぜなら、文字を縦方向と横方向の両方に出力しなければならないからです。さらに、図形は上端から中央に向かって徐々に大きくなり、中央から下端に向かって徐々に小さくなるという特徴もあります。このため、内側にもう1つのforループを含む、2つのforループを使用します。前半のループで上側(頂点から中央まで)を描き、後半のループで下側(中央から底辺まで)を描く仕組みです。サンプルコードdef