pandas 条件抽出

投稿者: | 2021-12-16

目次

query

主な条件抽出の記法

  • 上:Booleanインデックス法(Boolean選択法)
  • 下:クエリー
df[df['age'] < 25]
df.query('age < 25')
df[~(df['age'] < 25)]
df.query('not age < 25')
df[(df['age'] >=24) & (df['age'] < 50)]
df.query('24 <= age < 50')
df[df['age'] < (df['point'] / 3)]
df.query('age < point / 3')
df[df['state'] == 'CA']
df.query('state == "CA"')
df.query('state == ["NY", "TX"]')
df[df['state'].isin(['NY', 'TX'])]
df[(df['state'] == 'NY') | (df['state'] == 'TX')] #← NY or TXを含む
df.query(‘CH == “基地局” & 電力エリア == “中国電力”‘)
df.query('name.str.endswith("e")', engine='python')
df.query('name.str.contains("li")', engine='python')
df.query('name.str.match(".*i.*e")', engine='python')
# 文字列以外の型(数値)は1度str化して、そのstrから検索する
df.query('age.astype("str").str.endswidth("8"), engine='python')

欠損値NaNがある場合の注意点

  • NoneやNanがある列に対して文字列メソッドを適用して条件とするとエラーになるため、na=Falseとすると欠損値の行は抽出されない(Booleanインデックス法)
  • queryでは以下はできないらしい
df[df['name'].str.endswith('e', na=False)]
# NaNをBooleanのFalseに変更できる

index列に対する条件

  • index列(行名)に対する条件はindxで指定可能
df.query('index % 2 == 0')
# この場合、0行を含む偶数行が表示される

変数を使う

  • query()メソッドの条件文字列で変数を使用するには変数の前に@をつける
  • cf. queryメソッドは列名に「.」やスペースが入ると機能しない
val = 80
df.query('point > @val')

filter

# サンプルDF
df = pd.DataFrame(
    {'A': [0,1,2],
     'B':[3,4,5],
     'C':[6,7,8]},
     index=['apple','banana','pineapple']
    )