[Python #18]pandas queryメソッドの使い方

こんにちは、pythonチームのK.Iです。

先日、csvの中から条件に該当する項目を数える業務がありました。

少し複雑な条件だったのでpythonで軽くコード組むか〜といった感じで書いていたわけですよ。

私の頭の中で”条件に該当する個数を数える” = "for文を使って数えればいいんだ"と閃いたので

長々とfor文の繰り返しを書きました。

↓こんな感じです。

count = 0
for i in range(len(df)):
    if df[column][i] >= 20:
        count += 1
    else:
        pass

もちろんこの方法でも集計できます。

ですが、書き終えてみてfor文を使用しなくてもpandasにメソッドあるのでは?と思って

Google先生に聞いってみたらqueryメソッドを教えてくれました。

このような経緯から、今回はpandasライブラリのqueryメソッドについてご紹介したいと思います。

queryメソッドとは?

pandasライブラリのqueryメソッドは条件に該当するものを抽出してくれます。

例えば↓のようなデータフレームがあったとします。

        name  height  weight gender
0      Alice     160      55      w
1        Bob     180      70      m
2      Chris     170      65      m
3  Danieelle     175      60      m
4       Emma     165      50      w

この中でheightが165以上の人は誰であるかを知りたいと思った時、queryメソッドを使えば簡単に抽出してくれます。

データフレームの準備

まずはcsvを作成するところから始めます。

csvの作成方法については[Python #16] pandasでcsvファイルを扱うをご参照ください。

import pandas as pd

df = pd.DataFrame(
    data={
    'name': pd.Series(["Alice","Bob","Chris","Danielle","Emma"]),
    'height': pd.Series([160, 180, 170, 175,165]),
    'weight': pd.Series([55,70,65,60,50]),
    'gender': pd.Series(['w','m','m','m',"w"])})

df.to_csv("sample.csv",index=False)

csv作成ができました。

次はcsvの読み込みです。読み込んでいただいてprintしていただくと以下のようになると思います。

df = pd.read_csv("sample.csv")
print(df)

"""
       name  height  weight gender
0     Alice     160      55      w
1       Bob     180      70      m
2     Chris     170      65      m
3  Danielle     175      60      m
4      Emma     165      50      w

"""

実際にqueryメソッドを使ってみる

queryメソッドを使ってみます。

まず初めに"Alice","Bob","Chris","Danielle","Emma"の中でheightが165以上の人は誰なのか抽出していきたいと思います。

print(df.query('height >= 165'))

"""
       name  height  weight gender
1       Bob     180      70      m
2     Chris     170      65      m
3  Danielle     175      60      m
4      Emma     165      50      w
"""

また、queryメソッドは複数条件でも絞り込むことができます。

print(df.query('height >= 165 and weight<=60'))

"""
       name  height  weight gender
3  Danielle     175      60      m
4      Emma     165      50      w
"""

print(df.query('height >= 165 & weight<=60 & gender == "w"'))#"and"は"&"でも使えます。

"""
   name  height  weight gender
4  Emma     165      50      w
"""

抽出する方法にはandだけではなくorやnot などもあるので色々試していただければと思います。

おわりに

今回はデータフレームから条件の抽出するqueryメソッドをご紹介しました。

次回以降に集計することがあればqueryメソッドで抽出したものを確認したのちに

len()を使って集計しようと思います。

print(len(df.query('height >= 165 and weight<=60')))
#2

参考文献

[Python #16] pandasでcsvファイルを扱う

pandas.DataFrameの行を条件で抽出するquery