Pythonで表形式のデータを扱うのに便利なpandas。
表形式のデータであればRDBMSのように一部のデータだけ抽出したいこともあるだろう。
だがpandasはRDBMSではないのでSQLで条件指定するわけにはいかない。
ではどうやって条件指定してフィルタすればいいのか。
そこで今回はpandasのDataFrameを複数条件でフィルタする方法について解説する。
この記事を書いている人
記事を読むメリット
pandasのDataFrameを複数条件でフィルタする方法がわかる
pandasのDataFrameをフィルタする方法
まずpandasでDataFrameをフィルタする方法だが、比較演算子等で条件指定する。
ただし単純に df["column_name"] > 1
とするのではなく、 df[df["column_name"] > 1]
という形式で指定する。
import pandas as pd data_list1 = [ [1,2,None], [2,None,4], [None,4,5], [4,5,6] ] col_list1 = ["c1","c2","c3"] df1 = pd.DataFrame(data=data_list1, columns=col_list1) print(df1) # c1 c2 c3 # 0 1.0 2.0 NaN # 1 2.0 NaN 4.0 # 2 NaN 4.0 5.0 # 3 4.0 5.0 6.0 print(df1["c1"]>=2.0) # 0 False # 1 True # 2 False # 3 True # Name: c1, dtype: bool df2 = df1[df1["c1"]>=2.0] print(df2) # c1 c2 c3 # 1 2.0 NaN 4.0 # 3 4.0 5.0 6.0
最初の df1["c1"]>=2.0
はデータを抽出するのではなく、条件に合う行を True
、合わない行を False
としてboolean型のSeriesが返ってくる。
それを同じDataFrameに入力すると、 True
の行のみ抽出できる。
この2段階の処理で条件に合致したデータのみを抽出している。
pandasのDataFrameを複数条件でフィルタする方法
では条件が複数になったらどうすればいいのか。
方法としては &
や |
で条件を結合すればよい。
df3 = df1[ (df1["c1"]>=2.0) & (df1["c2"]>=3.0)] print(df3) # c1 c2 c3 # 3 4.0 5.0 6.0 df4 = df1[ (df1["c1"]>=2.0) | (df1["c3"].isna())] print(df4) # c1 c2 c3 # 0 1.0 2.0 NaN # 1 2.0 NaN 4.0 # 3 4.0 5.0 6.0
&
は AND
の意味なので、両方の条件に合致した行のみ抽出される。
|
は OR
という意味なので複数条件のうちどれかひとつに合致する行が抽出される。
まとめ
今回はpandasのDataFrameを複数条件でフィルタする方法について紹介した。
DataFrameの一部を条件指定して抽出するには df[df["カラム名"] > 1]
のような形でDataFrameの中で条件式を記述すればよい。
そして複数条件を指定したい場合は 条件式同士を &
や |
で結合すれば複数の条件を指定できる。
今回のようなPythonを使ったスクリプト。
一度きりの計算であれば手元で処理を実行すればよいが、もし定期的に処理を実行しようと思うと開発マシンとは別に実行環境を用意する必要がある。
クラウド環境を使う方法もあるが、安価な小型マシンを用意するとランニングコストが抑えられるので検討すると良いかも知れない。
あわせて読みたい