LoginSignup
101
75

More than 3 years have passed since last update.

pandas.DataFrame.queryによるデータ抽出10選

Posted at

はじめに

この記事ではpandasの関数の1つであるqueryを用いた様々な条件抽出について紹介します。
筆者の経験の中で、データ前処理時に高頻度で遭遇する10つの例を元に実際のコードを記載します。

実行環境

  • mac OS Mojave
  • Python 3.7.3
!python -V
Python 3.7.3

使用モジュール

pandasのversionは1.0.3を使用します。
※version0.24.0以前のversionだとエラーが出る可能性あります。

import pandas as pd  # 今回の主役
import numpy as np  # infやnanの値を生成するために使用
# pandasのversion確認
print(pd.__version__)
1.0.3

データ準備

# 今回使用するデータフレームの準備
df = pd.DataFrame({
        'a': range(1, 6),
        'b': range(10, 0, -2),
        'c c' : [1, 3, 5, 7, 9],
        'd' : [2, np.nan, np.inf, None, 10],
        'e' : ['a', 'b', 'c', 'd', 'e'],
        'f' : [False, True, True, False, True]})
# データフレームの確認
df
a b c c d e f
0 1 10 1 2.0 a False
1 2 8 3 NaN b True
2 3 6 5 inf c True
3 4 4 7 NaN d False
4 5 2 9 10.0 e True

データ抽出10選

  1. 1列での条件抽出
  2. 複数列での条件抽出
  3. カラム名にスペースを含む列の条件抽出
  4. 文字列指定による条件抽出
  5. 複数条件による条件抽出
  6. inf指定による条件抽出
  7. 欠損値指定による条件抽出
  8. 真偽値指定による条件抽出
  9. リストを使用した条件抽出
  10. 変数を使用した条件抽出

1列での条件抽出

データフレームの1列のみを使用した基本的な条件抽出。通常の比較演算子を使用可能。

df.query('a == 3')  # a列の値が3である行を抽出
a b c c d e f
2 3 6 5 inf c True
df.query('a != 3')  # a列の値が3でない行を抽出
a b c c d e f
0 1 10 1 2.0 a False
1 2 8 3 NaN b True
3 4 4 7 NaN d False
4 5 2 9 10.0 e True
df.query('a > 3')  # a列の値が3より大きい行を抽出
a b c c d e f
3 4 4 7 NaN d False
4 5 2 9 10.0 e True

複数列での条件抽出

複数列間の値を使用した条件抽出

df.query('a > b')  # a列の値がb列の値より大きい行を抽出
a b c c d e f
4 5 2 9 10.0 e True

カラム名にスペースを含む列の条件抽出

カラム名にスペースを含む場合はカラム名をバッククォート(`)で囲む必要がある。
この機能はpandas 0.25.0で実装された機能なのでversion0.24.0以前ではエラーとなる。
https://pandas-docs.github.io/pandas-docs-travis/whatsnew/v0.25.0.html#other-enhancements

df.query(' `c c` > b')  # c c列の値がb列の値より大きい行を抽出
a b c c d e f
3 4 4 7 NaN d False
4 5 2 9 10.0 e True

文字列指定による条件抽出

条件を文字列で指定する場合は、値をダブルクォート(")で囲む必要がある。

df.query('e == "a" ')  # e列の値が文字列"a"である行を抽出
a b c c d e f
0 1 10 1 2.0 a False

複数条件による条件抽出

複数の条件とandやorなどの論理演算子を用いた条件抽出。

df.query('a > 2 and b < 3')  # a列の値が2より大きいかつb列の値が3より小さい行を抽出
a b c c d e f
4 5 2 9 10.0 e True
df.query('a > 2 or b < 3')  # a列の値が2より大きいあるいはb列の値が3より小さい行を抽出
a b c c d e f
2 3 6 5 inf c True
3 4 4 7 NaN d False
4 5 2 9 10.0 e True
df.query('a > 2 or e == "d" ')  # a列の値が2より大きいあるいはe列の値が文字列"d"である行を抽出
a b c c d e f
2 3 6 5 inf c True
3 4 4 7 NaN d False
4 5 2 9 10.0 e True
df.query(' 2<= a <= 4')  # a列の値が2以上4以下の範囲にある行を抽出
a b c c d e f
1 2 8 3 NaN b True
2 3 6 5 inf c True
3 4 4 7 NaN d False

inf指定による条件抽出

値にinfを持つ場合は、以下のように抽出する。

df.query(' d == inf')  # d列の値がinfである行を抽出
a b c c d e f
2 3 6 5 inf c True
df.query(' d != inf')  # d列の値がinfではない行を抽出
a b c c d e f
0 1 10 1 2.0 a False
1 2 8 3 NaN b True
3 4 4 7 NaN d False
4 5 2 9 10.0 e True

欠損値指定による条件抽出

値に欠損値を持つ場合は以下のように抽出する。

df.query(' d != d')  # d列の値が欠損である行を抽出
a b c c d e f
1 2 8 3 NaN b True
3 4 4 7 NaN d False
df.query(' d == d')  # d列の値が欠損でない行を抽出
a b c c d e f
0 1 10 1 2.0 a False
2 3 6 5 inf c True
4 5 2 9 10.0 e True

真偽値指定による条件抽出

値にTrueやFalseなどの真偽値を持つ場合は以下のように抽出する。

df.query('f == True')  # f列の値がTrueの行を抽出
a b c c d e f
1 2 8 3 NaN b True
2 3 6 5 inf c True
4 5 2 9 10.0 e True
df.query('f == False')  # f列の値がFalseの行を抽出
a b c c d e f
0 1 10 1 2.0 a False
3 4 4 7 NaN d False

リストを使用した条件抽出

値がリストに入っているかどうかで条件抽出することが可能。

df.query(' a in (1, 2, 3)')  # a列の値が(1, 2, 3)のいずれかである行を抽出
a b c c d e f
0 1 10 1 2.0 a False
1 2 8 3 NaN b True
2 3 6 5 inf c True
df.query(' a not in (1, 2, 3)')  # a列の値が(1, 2, 3)のどれでもない行を抽出
a b c c d e f
3 4 4 7 NaN d False
4 5 2 9 10.0 e True

変数を使用した条件抽出

条件の値として予め用意した変数を使用することが可能。

x = 2  # 変数xに2を格納
df.query(' a == @x')  # a列の値がxである行を抽出
a b c c d e f
1 2 8 3 NaN b True
y = [2, 3, 4]  # 変数yにリストを格納
df.query('a in @y')  # a列の値がyのいずれかである行を抽出
a b c c d e f
1 2 8 3 NaN b True
2 3 6 5 inf c True
3 4 4 7 NaN d False
101
75
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
101
75