比較的よく使うPandas Query(クエリ―)の簡単な条件指定例(Python)

比較的よく使うPandas Query(クエリ―)の簡単な条件指定例(Python)

PythonEDA(探索的データ分析)を実施するとき、PandasのQuery(クエリ―)を使う方も多いことでしょう。

ここで紹介するQuery(クエリ―)は、Pandasの関数の1つで、データフレームに対し条件抽出するときに利用したりします。

よく使う平凡な使い方を紹介します。

ということで、今回は「比較的よく使うPandas Query(クエリ―)の簡単な条件指定例(Python)」というお話しです。

numexprを使おう!

PandasのQuery(クエリ―)を処理を高速化するライブラリーに、numexprというものがあります。

高速化といっても、数万行を超えるようなデータに対してなので、データセットの行数が少ない場合には意味はありません。

気になる方は、以下のURLを参考にしてください。

Pandas User Guide Enhancing performance
https://pandas.pydata.org/pandas-docs/stable/user_guide/enhancingperf.html

これといって害はないので、PandasのQuery(クエリ―)を使う方はインストールしておきましょう。

以下、numexprのインストールするときのコードです。

pip install numexpr

 

ちなみに、numexprをインストールはしているけど使いたくない場合には、query()の引数engineで指定できます。

engine=’python’とするとnumexprを使いません。明示的にengine=’numexpr’とすることもできますが、numexprがインストールされている場合にはデフォルトでnumexprが指定されるので意味はありません。

numexprがインストールされていないときには、engine=’python’がデフォルトになります。

1点注意点があります。文字列メソッドを使うときには、engine=’python’とする必要があります。後ほど例示します。

また今回は、Pandas-Profilingを利用してデータセットの概況(欠測状況など)を見ますので、インストールされていない方はインストールして頂ければと思います。

以下、コードです。

pip install pandas-profiling

 

Pandas-Profilingは必須ではありません。

 

ライブラリーとサンプルデータの読み込み

先ず、必要なライブラリーを読み込みます。

以下、コードです。

# ライブラリーの読み込み
## 基礎ライブラリー
import pandas as pd
## 例で利用するデータセット
from sklearn.datasets import fetch_openml
## EDAツール
from pandas_profiling import ProfileReport

 

今回は、みんな大好きタイタニック(titanic)のデータを使います。

では、タイタニックサンプルデータを読み込みます。

以下、コードです。

# タイタニック(titanic)のデータセット
titanicXy = fetch_openml("titanic", version=1, as_frame=True, return_X_y=False).frame

 

データセット「titanicXy」がどのようなデータなのかを見てみます。

以下、コードです。

titanicXy

 

以下、実行結果です。

 

次にPandas-Profilingを使い、どのようなデータなのか確認します。

以下、コードです。

profile_titanic = ProfileReport(titanicXy, explorative=True)
profile_titanic.to_file("profile_titanic.html")
profile_titanic

 

以下、実行結果です。

 

14変数(内、9変数がカテゴリカル、5変数が数値)×1309行のデータセットで、21%のデータが欠測しています。

紹介するquery()の条件指定例

今回紹介するquery()の条件指定例です。

  • 欠測値指定によるデータ抽出
  • 比較演算子で条件指定しデータ抽出
  • in演算子(リスト)で条件指定しデータ抽出
  • 文字列メソッドで条件指定しデータ抽出
  • 変数を使って条件指定しデータ抽出

どれもオーソドックスな方法です。

欠測値指定によるデータ抽出

age」に20.1%の欠測値が発生しています。

 

age」が欠測している行を抽出してみます。

以下、コードです。

titanicXy.query('age != age')

 

以下、実行結果です。

 

今度は、「age」が欠測していない行を抽出してみます。

以下、コードです。

titanicXy.query('age == age')

 

以下、実行結果です。

 

body」に90.8%の欠測値が発生しています。

 

今度は、「age」と「body」の両方とも欠測していない行を抽出してみます。

以下、コードです。

titanicXy.query('age == age' and 'body == body')

 

以下、実行結果です。

 

比較演算子で条件指定しデータ抽出

比較演算子とは……

  • ==
  • !=
  • <
  • >
  • <=
  • >=

……などです。

今説明した「欠測値指定によるデータ抽出」で使っていました(==!=)。

例えば、20歳未満のデータを抽出してみます。

以下、コードです。

titanicXy.query('age < 20')

 

以下、実行結果です。

 

否定するときは、notを使います。

以下、コードです。

titanicXy.query('not age < 20')

 

以下、実行結果です。

 

次に、20歳以上60歳以下のデータを抽出してみます。

以下、コードです。

titanicXy.query('20 <= age <= 60')

 

以下、実行結果です。

 

index列に対しても条件指定しデータ抽出できます。

以下、コードです。

titanicXy.query('10 <= index <= 20')

 

以下、実行結果です。

 

文字列に対しても使えます。

例えば、「ticket」が「CA. 2343」のデータを抽出してみます。

以下、コードです。

titanicXy.query('ticket == "CA. 2343"')

 

以下、実行結果です。

 

in演算子(リスト)で条件指定しデータ抽出

設定したリストに合致したデータを抽出します。

例えば、「ticket」が「CA. 2343」と「CA 2144」と「PC 17608」のデータを抽出してみます。文字列です。

以下、コードです。

titanicXy.query('ticket in ["CA. 2343","CA 2144","PC 17608"]')

 

以下、実行結果です。

 

例えば、「pclass」が「1」と「2」のデータを抽出してみます。数値データです。

以下、コードです。

titanicXy.query('pclass in [1,2]')

 

以下、実行結果です。

 

文字列メソッドで条件指定しデータ抽出

文字列に対する条件指定は、ここまで説明したような方法(==in)で基本できます。このやり方は、完全一致する条件設定です。

ここで紹介するのは、部分一致する条件設定の方法です。

4つの文字列メソッドです。

  • str.contains(): 指定した文字列を含む
  • str.startswith(): 指定した文字列で始まる
  • str.endswith(): 指定した文字列で終わる
  • str.match(): 正規表現

ここで1つ注意点があります。query()の設定を「engine=’python’」とする必要があります。

例えば、「name」に「Hudson」が含まれるデータを抽出してみます。

以下、コードです。

titanicXy.query('name.str.contains("Hudson")', engine='python')

 

以下、実行結果です。

 

次に、「name」が「All」で始まるデータを抽出してみます。

以下、コードです。

titanicXy.query('name.str.startswith("All")', engine='python')

 

以下、実行結果です。

 

name」が「Henry」で終わるデータを抽出してみます。

以下、コードです。

titanicXy.query('name.str.endswith("Henry")', engine='python')

 

以下、実行結果です。

 

正規表現も使えます。

以下、コードです。

titanicXy.query('name.str.match(".*Ha.*He")', engine='python')

 

以下、実行結果です。

 

ここでは正規表現そのものの説明は割愛します。

変数を使って条件指定しデータ抽出

条件指定で変数を使用することもできます。変数名の前に@を付けます。

例えば、20歳以上60歳以下のデータを抽出してみます。

以下、コードです。

ageL = 20
ageU = 60
titanicXy.query('@ageL <= age <= @ageU')

 

以下、実行結果です。

 

まとめ

PythonEDA(探索的データ分析)を実施するとき、PandasのQuery(クエリ―)を使う方も多いことでしょう。

今回は、比較的よく使うQuery(クエリ―)の条件抽出例を説明しました。