はじめに
この記事ではpandasの関数の1つであるqueryを用いた様々な条件抽出について紹介します。
筆者の経験の中で、データ前処理時に高頻度で遭遇する10つの例を元に実際のコードを記載します。
実行環境
- mac OS Mojave
- 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__)
データ準備
# 今回使用するデータフレームの準備
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]})
|
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列での条件抽出
- 複数列での条件抽出
- カラム名にスペースを含む列の条件抽出
- 文字列指定による条件抽出
- 複数条件による条件抽出
- inf指定による条件抽出
- 欠損値指定による条件抽出
- 真偽値指定による条件抽出
- リストを使用した条件抽出
- 変数を使用した条件抽出
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 |