Python

PandasのDataframeから要素を抽出する方法

By 2022年3月5日No Comments

この記事では、PandasのDataframeの行名や列名から行番号や列番号を取得する方法について解説します。

プログラミング初心者対象!Python入門セミナー

プログラミング初心者がPythonの初歩部分を突破するためのセミナーです。

行名、列名から行番号、列番号を取得する

使用するのは、PythonのPandasライブラリの get_locメソッドです。今回は、以下のデータを使用します。5人の生徒に対する数学、英語、物理のテスト結果のデータセットになります。

data = pd.DataFrame(np.array([[80, 70, 80], [60, 60, 60], [90, 80, 70], [40, 50, 40], [50, 80, 90]]), columns=["Math", "English", "Physics"], index=["Tanaka", "Suzuki", "Sato", "Yamada", "Ogawa"])

print(data)
#         Math  English  Physics
# Tanaka    80       70       80
# Suzuki    60       60       60
# Sato      90       80       70
# Yamada    40       50       40
# Ogawa     50       80       90

print(data.index.values)  # dataの行のラベル
# ['Tanaka' 'Suzuki' 'Sato' 'Yamada' 'Ogawa']

print(data.columns.values)  # dataの列のラベル
# ['Math' 'English' 'Physics']

まずは、行番号を取得してみましょう。行の場合はindex.get_loc()で引数に行の名前を指定します。行番号、列番号ともに0始まりの整数で返されます。Tanakaというindexを抽出します。

print(data.index.get_loc('Tanaka'))  # Tanakaは文字列なので'(シングルクォーテーション)で囲む
# 0

Tanakaの行番号である0が取得できました。

次に列番号を取得してみましょう。列の場合はcolumns.get_loc()で引数に列の名前を指定します。Englishの列を抽出します。

print(data.columns.get_loc('English'))
# 1

Englishの列番号である1が取得できました。

行名、列名に存在しないものを引数に入れた場合エラーが出されます。

今回は生徒の中にKikuchiはいないのでエラーが出ます。

print(data.index.get_loc('Kikuchi'))
# KeyError: 'Kikuchi'

行名、列名が重複している場合は、get_loc()メソッドは行番号ではなくNumpy配列を返します。以下のデータを使用します。今回の場合はTanakaが2人いるため、Numpy配列によるTrue or Falseで返されます。

data = pd.DataFrame(np.array([[80, 70, 80], [60, 60, 60], [90, 80, 70], [40, 50, 40], [50, 80, 90]]), columns=["Math", "English", "Physics"], index=["Tanaka", "Suzuki", "Tanaka", "Yamada", "Ogawa"])

print(data)
#         Math  English  Physics
# Tanaka    80       70       80
# Suzuki    60       60       60
# Tanaka    90       80       70
# Yamada    40       50       40
# Ogawa     50       80       90

print(data.index.get_loc('Tanaka'))
# [ True False  True False False]

print(type(data.index.get_loc('Tanaka')))
# <class 'numpy.ndarray'>

query() で条件を用いて抽出する

pandas.DataFrameの値に対する条件に応じて抽出をするのにはquery()メソッドを使います。

以下のように、Tanakaの結果のみを取得することができます。結果はpandas.Dataftameで返されます。

print(data.query('index == "Tanaka"'))
#         Math  English  Physics
# Tanaka    80       70       80
# Tanaka    90       80       70

またquery()メソッドで、任意の列の要素に対する条件で行を抽出することができます。英語の点数が80点の要素を抽出してみます。

print(data.query('English == 80'))
#         Math  English  Physics
# Tanaka    90       80       70
# Ogawa     50       80       90

query()で抽出した結果をリスト化することで、特定の値の行名のリストを取得することができます。

print(list(data.query('English == 80').index))
# ['Tanaka', 'Ogawa']

比較演算子を使って行を抽出することができます。英語の点数が80点未満の生徒の結果を以下のように確認できます。

print(data[data['English'] < 80])
#         Math  English  Physics
# Tanaka    80       70       80
# Suzuki    60       60       60
# Yamada    40       50       40

query()メソッドを用いて同様の条件を指定できます。この場合、列名に対する条件を文字列で指定します。ひとつ上の書き方と同じ結果が返されますが、よりシンプルにコーディングができます。

print(data.query('English < 80'))
#         Math  English  Physics
# Tanaka    80       70       80
# Suzuki    60       60       60
# Yamada    40       50       40

notを使うことで否定を取ることができます。英語が80点未満の否定なので、80点以上の結果を出力します。

print(data.query('not English < 80'))
#         Math  English  Physics
# Tanaka    90       80       70
# Ogawa     50       80       90

2つの比較演算子を使って範囲を指定することもできます。今回は英語が70点以上80点以下の結果を出力します。

print(data.query('70 <= English <= 80'))
#         Math  English  Physics
# Tanaka    80       70       80
# Tanaka    90       80       70
# Ogawa     50       80       90

列と列の比較を行うこともできます。英語の点数よりも物理の点数が高い生徒の結果を出力します。

print(data.query('English < Physics'))
#         Math  English  Physics
# Tanaka    80       70       80
# Ogawa     50       80       90

次は、2つの条件を用いて抽出を行ってみましょう。まずはorを用いてどちらか一方でも条件を満たしている要素を抽出してみましょう。例えば、数学が60点もしくは英語が80点の要素を抽出してみましょう。

print(data.query('Math == 60 or English == 80'))
#         Math  English  Physics
# Suzuki    60       60       60
# Tanaka    90       80       70
# Ogawa     50       80       90

andを用いてどちらの条件も満たす要素を抽出してみましょう。例えば、数学が60点かつ英語が60点の場合は以下のようになります。

print(data.query('Math ==60 and English == 60'))
#         Math  English  Physics
# Suzuki    60       60       60

まとめ

今回はPandasのDataframeの行名や列名から行番号や列番号を取得する方法について解説しました。Dataframeの活用の際には必要な知識となるので、しっかり学んで自分のものにしましょう。

Udemyの動画学習でもPythonを勉強しよう!

「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!

UdemyのPythonおすすめ33講座レビューリスト
HOSL

Author HOSL

More posts by HOSL