この記事では、PandasのDataframeの行名や列名から行番号や列番号を取得する方法について解説します。
目次
Udemyの動画学習でもPythonを勉強しよう!
「平日の夜の勉強会には時間が間に合わなくて参加できない」「通勤時間のわずかな隙間時間を勉強時間にあてたい」「本ではよく分からないところを動画で理解を深めたい」そんなあなたはUdemyの動画学習がお勧めです!
UdemyのPythonおすすめ33講座レビューリスト行名、列名から行番号、列番号を取得する
使用するのは、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講座レビューリスト