pandasのDataFrameで条件式を用いてデータの抽出を行う方法を説明します。データの抽出にはいくつかの方法がありますが、ここでは基本となるブールインデックス参照を用いた方法を解説していきます。
開発環境
- pandas 1.0.3
- Python 3.7.7
サンプルデータ
サンプルデータとして以下のデータを用います。
以下のようにURLを指定して、DataFrameとして取得できます。
df = pd.read_excel('https://biotech-lab.org/wp-content/uploads/2020/03/dataframe-sample-01.xlsx')
ブールインデックス参照とは?
DataFrameの要素を抽出する際に、添え字に要素数と同じ数のbool型のリストでインデックスを指定するとTrue
で指定されたもののみが抽出されます。例えば以下のようにDataFrameのインデックスとして「[False, True, True, False]
」と指定すると、True
で指定された2番目と3番目のデータが抽出されます。
import pandas as pd
df = pd.read_excel('https://biotech-lab.org/wp-content/uploads/2020/03/dataframe-sample-01.xlsx')
print(df[[False, True, True, False]])
名前 性別 年齢 職業 1 佐藤花子 女 45 弁護士 2 高橋太郎 男 30 医師
このような要素の参照の方法を「ブールインデックス参照」と呼びます。これはpandas.DataFrameだけではなくてnumpy.ndarrayの要素の参照などにも採用されていて、Pythonで広く用いられている参照方法です。
なお、DataFrameではブールインデックスとしてbool型のリストだけではなくて、Seriesでも指定可能です。
また、ブールインデックスの指定方法は以下のいずれの方法でも構いません。
import pandas as pd
df = pd.read_excel('https://biotech-lab.org/wp-content/uploads/2020/03/dataframe-sample-01.xlsx')
df1 = df[[False, True, True, False]]
df2 = df.loc[[False, True, True, False]]
df3 = df.iloc[[False, True, True, False]]
DataFrameの成分へのアクセス方法については以下の記事もご覧ください。
ブールインデックス参照を使って条件を指定する
それでは、このブールインデックス参照を使ってDataFrameの要素を条件を指定して抽出してみましょう。
ブールインデックスを作成する
Seriesに比較演算子を用いると、同じ要素数のブール値(True / False)からなるSeriesが返されます。例えば以下のように、「df['年齢'] > 40
」とすると、サンプルデータで年齢が40より大きいものがTrueとなったSeriesとしてブールインデックスが作成されます。
import pandas as pd
df = pd.read_excel('https://biotech-lab.org/wp-content/uploads/2020/03/dataframe-sample-01.xlsx')
boolindex = df['年齢'] > 40
print(boolindex)
0 True 1 True 2 False 3 True Name: 年齢, dtype: bool
DataFrameにブールインデックスを指定する
先ほど作成したブールインデックスをもとのDataFrameの添え字に指定してみましょう。
import pandas as pd
df = pd.read_excel('https://biotech-lab.org/wp-content/uploads/2020/03/dataframe-sample-01.xlsx')
boolindex = df['年齢'] > 40
df_new = df[boolindex]
print(df_new)
名前 性別 年齢 職業 0 田中一郎 男 50 会社員 1 佐藤花子 女 45 弁護士 3 橋本清 男 41 自営業
これで、先ほどTrueとなったものだけが抽出されました。
なお、ここまでの説明ではわかりやすくするために一つ一つの処理を行を分けて書きましたが、通常は以下のようにまとめて記述されます。
import pandas as pd
df = pd.read_excel('https://biotech-lab.org/wp-content/uploads/2020/03/dataframe-sample-01.xlsx')
print(df[df['年齢'] > 40])
ブールインデックス参照はPythonで共通の考え方でもあり基本的な方法ですが、上のコードのように「df[df['年齢'] > 40]
」とdf
が重なってしまうので、やや可読性にかけるコードになってしまいます。そこで、DataFrameではブールインデックス参照のほかにもqueryメソッドを使ったよりスマートなデータの抽出方法も用意されています。詳しくは以下の記事もご覧ください。
コメント