SWELL公式サイトへ 詳しくはこちら

📌 pandasのquery()を理解しよう!NumPyで代替する方法も解説

  • URLをコピーしました!
目次

1. はじめに

データ分析を行う際、特定の条件に基づいてデータを抽出することはよくあります。
pandas には query() という便利なメソッドがあり、SQL の WHERE 句のような書き方でデータをフィルタリングできます。

一方、NumPy には query() のようなメソッドはありませんが、ブールインデックスや np.where() などを使って同じような処理を実現する方法 があります。

本記事では、
✅ pandas の query() の使い方を詳しく解説
✅ さらに、NumPy で query() を使わずに同じ処理を実現する
方法を紹介していきます。

「pandas の query() って何?」という人や、「NumPy ではどうすればいいの?」と疑問に思っている人に向けた記事です!

pandas の query() とは?

pandas の query() は、DataFrame に対して SQLの WHERE 句のような直感的な条件指定 を可能にするメソッドです。

例えば、以下のようなデータがあるとします。

import pandas as pd

df = pd.DataFrame({
    "A": [1, 3, 5, 2],
    "B": [7, 8, 5, 6]
})

この DataFrame から 「Aの値が2より大きい」 行を抽出したい場合、通常は以下のように書きます。

df[df["A"] > 2]

しかし、query() を使えば、次のように シンプルに記述できます!

df.query("A > 2")

このように、SQLの WHERE 句のような 直感的な記述 でデータをフィルタリングできるのが query() の最大の特徴です。

query() の便利なポイント

SQL のような書き方で可読性が高い
query("A > 2 & B >= 6") のように書くことで、条件が明確に理解できる。

DataFrame のフィルタリングをシンプルに記述できる
df[df["A"] > 2] よりも df.query("A > 2") の方がスッキリして読みやすい。

AND (&) や OR (|) を使って複数条件を指定可能
SQL に慣れている人なら、すぐに使いこなせる。

in を使って複数の値を簡単にフィルタリング

df.query("A in [3, 5]")

SQL の IN 句のように使えて便利。

NumPy には query() がない → どうやって代替するのか?

pandas の query() は便利ですが、NumPy の配列 (np.array) には query() メソッドがありません。
では、NumPy で pandas の query() と同じような処理を行うにはどうすればいいのでしょうか?
答えは、ブールインデックスや np.where()np.extract() などを活用すること です。

例えば、NumPy の配列を使って query("A > 2 & B >= 6") と同じことをするには、次のような方法があります。

import numpy as np

A = np.array([1, 3, 5, 2])
B = np.array([7, 8, 5, 6])

# ブールインデックスを使う
mask = (A > 2) & (B >= 6)
filtered_A = A[mask]

print(filtered_A)  # [3]

また、np.where() を使うと、query() に近い書き方も可能です。

indices = np.where((A > 2) & (B >= 6))
filtered_A = A[indices]

print(filtered_A)  # [3]

このように、NumPy でも query() の代替手段がある ため、データの扱い方を工夫すれば同じようなフィルタリングが可能になります。

2. query() の基本的な使い方(pandas編)

pandas の query() を使うと、SQL の WHERE 句のような感覚でデータをフィルタリングできます。

通常の df[df["A"] > 2] のような書き方より シンプルで可読性が高い ため、条件を適用したデータ抽出を頻繁に行う場合に便利です。

ここでは、query() の基本的な使い方を具体例とともに紹介します!

🔹 例1: シンプルな条件指定

「A列の値が2より大きいデータを抽出する」

import pandas as pd

df = pd.DataFrame({
    "A": [1, 3, 5, 2],
    "B": [7, 8, 5, 6]
})

filtered_df = df.query("A > 2")
print(filtered_df)

📝 出力結果

   A  B
1  3  8
2  5  5

💡 解説

  • query("A > 2") は、df[df["A"] > 2] の簡潔な書き方。
  • SQLで書くと SELECT * FROM df WHERE A > 2; に相当する。

🔹 例2: AND (&) / OR (|) の条件

「A列の値が2より大きく、かつB列の値が6以上のデータを抽出」

df.query("A > 2 & B >= 6")  # AND条件

📝 出力結果

   A  B
1  3  8

💡 解説

  • &「かつ(AND)」 を意味する。
  • SQL で書くと SELECT * FROM df WHERE A > 2 AND B >= 6;

「A列の値が2より大きい、またはB列の値が6以上のデータを抽出」

df.query("A > 2 | B >= 6")  # OR条件

📝 出力結果

   A  B
1  3  8
2  5  5
3  2  6

💡 解説

  • |「または(OR)」 を意味する。
  • SQL で書くと SELECT * FROM df WHERE A > 2 OR B >= 6;

🔹 例3: 文字列の条件

「C列の値が ‘〇’ のデータを抽出する」

df["C"] = ["〇", "X", "〇", "X"]

df.query("C == '〇'")

📝 出力結果

   A  B  C
0  1  7  〇
2  5  5  〇

💡 解説

  • C == '〇' のように 文字列をクエリ式で指定するときは ' または " で囲む 必要がある。
  • SQL で書くと SELECT * FROM df WHERE C = '〇';

🔹 例4: in の代わり

「C列が ‘〇’ または ‘△’ のデータを抽出する」

df.query("C in ['〇', '△']")

📝 出力結果

   A  B  C
0  1  7  〇
2  5  5  〇

💡 解説

  • 複数の値を条件にする場合、in を使うと簡潔に書ける。
  • SQL で書くと SELECT * FROM df WHERE C IN ('〇', '△');

📒まとめ

操作内容pandas query()SQL での表現
A列が2より大きいdf.query("A > 2")SELECT * FROM df WHERE A > 2;
A列が2より大きく、B列が6以上df.query("A > 2 & B >= 6")SELECT * FROM df WHERE A > 2 AND B >= 6;
A列が2より大きい または B列が6以上df.query("A > 2 | B >= 6")SELECT * FROM df WHERE A > 2 OR B >= 6;
C列が ‘〇’ のデータdf.query("C == '〇'")SELECT * FROM df WHERE C = '〇';
C列が ‘〇’ または ‘△’ のデータdf.query("C in ['〇', '△']")SELECT * FROM df WHERE C IN ('〇', '△');

3.📌 NumPyでは query() をどう代替する?

pandas では query() を使うことで、SQL の WHERE 句のようなフィルタリングが可能でした。
しかし、NumPy の配列 (np.array) には query() メソッドが存在しません。
では、NumPy で query() と同じようにデータをフィルタリングするにはどうすればいいのでしょうか?

NumPy では、以下の 3つの方法 を使うことで、query() と同じような処理を実現できます。

🔹 方法1: ブールインデックスを使う

NumPy の ブールインデックス(Boolean Indexing) を利用すると、特定の条件を満たす要素だけを抽出することができます。

これは query() に最も近い方法です。

例: 「A の値が 2 より大きく、かつ B の値が 6 以上のデータを抽出する」

import numpy as np

# NumPy 配列を作成
A = np.array([1, 3, 5, 2])
B = np.array([7, 8, 5, 6])

# 条件を満たす要素のマスクを作成
mask = (A > 2) & (B >= 6)

# ブールインデックスを使用してフィルタリング
filtered_A = A[mask]

print(filtered_A)  # [3]

📝 出力結果

[3]

💡 解説

  • mask = (A > 2) & (B >= 6)条件を満たす要素を True にするブール配列 を作成。
  • A[mask] のように ブール配列を使って A から該当要素を抽出 する。
  • pandas の query("A > 2 & B >= 6") に相当する処理!

🔹 方法2: np.where() を使う

NumPy の np.where() を使うと、query() の代替手段として 条件を満たすインデックスを取得 し、それを使ってデータを抽出できます。

例: 「A の値が 2 より大きく、かつ B の値が 6 以上のデータを抽出する」

indices = np.where((A > 2) & (B >= 6))  # 条件を満たすインデックスを取得
filtered_A = A[indices]  # インデックスを使ってデータ抽出

print(filtered_A)  # [3]

📝 出力結果

[3]

💡 解説

  • np.where((A > 2) & (B >= 6))条件を満たす要素のインデックスを取得 する。
  • A[indices] により、取得したインデックスを元にデータを抽出。
  • query() というより SQL の WHERE に近い動作をする!

🔹 方法3: np.extract() を使う

NumPy の np.extract() を使うと、条件に合う要素だけを直接抽出 することができます。

np.where() のようにインデックスを取得せずに、結果をそのまま返すのが特徴です。

例: 「A の値が 2 より大きく、かつ B の値が 6 以上のデータを抽出する」

filtered_A = np.extract((A > 2) & (B >= 6), A)

print(filtered_A)  # [3]

📝 出力結果

[3]

💡 解説

  • np.extract(condition, array) の形式で、条件を満たす要素だけを直接返す
  • np.where() のようにインデックスを取得しなくても、フィルタリングが可能。
  • pandas の query("A > 2 & B >= 6") の処理と似ているが、直接要素を返す点でブールインデックスに近い。

✅ どの方法を使うべき?

方法特徴おすすめポイント
ブールインデックス (A[mask])直感的でシンプル最も一般的で可読性が高い
np.where()条件を満たす インデックスを取得 し、そのインデックスを使ってデータを抽出インデックスが欲しい場合に便利
np.extract()条件を満たす要素を直接取得 できる直接データを取得したい場合におすすめ

📒まとめ

  • pandas の query()SQL風の簡潔な書き方 でデータをフィルタリングできる。
  • NumPy には query() がないが、ブールインデックス、np.where()np.extract() を使うことで同様の処理が可能
  • ブールインデックスが最も直感的 で使いやすいが、インデックスが欲しい場合は np.where()、直接データが欲しい場合は np.extract() を使うのが良い

4.📌 query() vs NumPyの方法 比較!どっちを使うべき?

pandas の query() は SQL 風のシンプルな書き方でデータをフィルタリングできる便利なメソッドですが、NumPy では query() が使えません。

では、pandas の query() と NumPy のブールインデックスや np.where() を使う方法では、どちらが優れているのでしょうか?

結論: どちらも用途に応じて適した場面がある!

以下の比較表で、それぞれの特徴を整理してみましょう。

🔹 query() vs NumPyの方法 比較表

条件pandas の query()NumPy の方法
可読性✅ 高い(SQL 風で直感的に書ける)やや低い(ブールインデックスを理解する必要あり)
柔軟性✅ 高い(DataFrame に最適化、文字列や in 句が使える)配列ベースの計算向き(DataFrame には不向き)
処理速度query()eval() を利用して最適化されているが、若干のオーバーヘッドがある✅ NumPy は一般的に高速(C言語で最適化されている)
適用対象✅ pandas の DataFrame / Series✅ NumPy の配列

🔹 それぞれの使い分けポイント

✅ pandas の query() を使うべき場面

  1. DataFrame を扱うとき
    • query() は DataFrame に最適化されているため、フィルタリングがシンプルで直感的。
  2. SQL 風に書きたいとき
    • query()SELECT * FROM df WHERE ... のように SQL に近い書き方ができるので、SQL に慣れている人には読みやすい。
  3. 文字列の条件を含めたいとき
    • query("C == '〇'") のように、==in 句を簡潔に書ける。
  4. 可読性を優先したいとき
    • df[df["A"] > 2] より df.query("A > 2") の方がスッキリして読みやすい。

✅ NumPy の方法を使うべき場面

  1. 高速処理を求めるとき
    • NumPy のブールインデックスや np.where()query() より一般的に高速。
  2. 配列(np.array)を扱うとき
    • NumPy のデータは pandas の query() では扱えないため、A[A > 2] のようにブールインデックスを活用する。
  3. 大量データの演算を行うとき
    • pandas の query()eval() を利用しているため、NumPy の直接計算に比べると若干遅いことがある。
  4. メモリ効率を重視するとき
    • pandas の query()eval() を使うため、一時的に追加のメモリを消費する可能性がある。
    • NumPy の方法は、単純な配列計算なのでメモリ使用量が少なくて済む。

🔹 どっちを使えばいい?

ケースおすすめの方法
DataFrame を扱う場合df.query()
配列 (np.array) を扱う場合NumPy のブールインデックス
SQL に慣れていて直感的に書きたいdf.query()
最大限の速度を求める場合NumPy のブールインデックス
in 句を使って複数値を条件に含めたいdf.query("C in ['〇', '△']")

📒 まとめ

  • query() は SQL 風で書けるため、DataFrame のフィルタリングに最適!
  • NumPy のブールインデックスや np.where() は、より高速で配列操作向き!
  • 可読性重視なら query()、処理速度やメモリ効率を重視するなら NumPy を活用!
  • 目的に応じて pandas と NumPy の使い分けが大事!

プログラミング初心者におすすめ!「スッキリわかるPython入門 第2版」

プログラミングに興味があるけれど、何から始めればいいかわからない方に最適な一冊が「スッキリわかるPython入門 第2版」です。以下のポイントを参考にしてください。

本書の特徴とメリット

  • シリーズ累計90万部突破
    多くの読者に支持され、信頼されている大人気入門書の改訂版。
  • 初心者でもわかりやすい解説
    基本的な「コツ」を丁寧に説明し、迷わず学習を進められます。
  • 実践的な「しくみ」の理解
    プログラミングの基礎だけでなく、実際の開発に役立つ知識を習得可能。
  • 「落とし穴」の回避
    初心者が陥りがちな間違いをカバーし、安心して学習を進められる内容。

実際の読者の声

  • 現役プログラミング教室の先生も推薦!
    「この本を読んでPCスキルをマスターすれば、それでメシを食えますよ」という評価もあるほどの内容。面白くて勉強になるとの声が多い。

この機会に「スッキリわかるPython入門 第2版」を手に入れ、プログラミングの世界に一歩踏み出しましょう。下のリンクをクリックして、詳細をチェックしてみてください!

テックジムの経験が詰まったPythonプログラミング講座

プログラミング教育において、多くの初学者が挫折する理由をご存じでしょうか?実は、それには多くの共通点があります。テックジムは、その問題点を深く理解し、20年以上にわたって蓄積してきた経験をもとに、誰もが安心して学べるプログラミング講座を提供しています。

テックジムは、ただの学習場ではありません。プログラミングを始めたい方や、より高いレベルに達したい方々に向けた、実践的な学びの場です。私たちが提供するカリキュラムは、初心者が直面する課題や躓きやすいポイントを徹底的に研究し、それを解決するためにデザインされています。

多くのプログラミングスクールが、フレームワークや複雑な技術から始めることで、学習者に過度な負担をかけ、結果として挫折を生む原因となっています。テックジムでは、まずは本当に重要な基礎からスタートすることで、無理なくスキルを積み上げていくことができます。例えば、関数やクラスといったプログラミングの核心部分をしっかりと理解し、それを使いこなすための時間を十分に確保しています。

これにより、受講生たちは無駄な混乱を避け、確実にスキルを身につけていくことができるのです。テックジムでの学びは、単なる知識の詰め込みではなく、実際に「できる」ことを目指した実践的なトレーニングです。

テックジムのPythonプログラミング講座は、経験と実績が詰まった講座です。初心者でも安心して参加でき、確実にステップアップできるこの講座で、あなたもプログラミングの世界に飛び込んでみませんか?

挫折を防ぐカリキュラム

プログラミング学習に挑戦した多くの人が、途中で挫折してしまうことがあります。これは、難解なフレームワークや複雑な概念にいきなり取り組むことが主な原因です。しかし、テックジムではそのような挫折を未然に防ぐため、独自のカリキュラムを採用しています。

テックジムのカリキュラムは、まず基礎をしっかりと固めることから始めます。関数やクラスといったプログラミングの根幹をじっくり学ぶことで、無駄な負荷をかけずに確実にスキルを身につけることができます。このアプローチにより、学習者は「何をやっているのかわからない」という混乱を避け、自信を持って次のステップに進むことができます。

また、テックジムでは、段階的にスキルを積み上げることで、学習の進行に伴う負担を最小限に抑えています。その結果、無理なく、着実にプログラミングの世界で成功を収めることができるのです。

テックジムのプログラミング講座は、学ぶことの楽しさを実感しながら、挫折せずに成長できる最適な環境を提供します。

最新の技術と経験豊富なサポートの融合

プログラミング学習において、最新技術の活用は欠かせません。テックジムでは、ChatGPTを用いた学習サポートを取り入れています。ChatGPTは、あらゆる質問に即座に答え、コードのバグ解決もスムーズにサポートします。これにより、効率的に学習を進めることが可能です。

しかし、テックジムの強みは、これだけではありません。どんなに優れたAIでも、人間のコーチによる個別サポートの価値は計り知れません。テックジムでは、経験豊富なプロのコーチがあなたの学習を支えます。プログラミングの基礎から応用まで、丁寧な指導と的確なフィードバックを提供し、あなたが抱える疑問や課題を一つ一つ解決していきます。

このように、最新の技術とプロのコーチングを組み合わせることで、テックジムでは、効率的でありながらも確実にスキルを身につけることができる学習環境を提供しています。

テックジムで学びながら、最先端のAI技術とプロの指導のベストな融合を体験してみませんか?

成果を実感できるカリキュラム

テックジムのPythonプログラミング講座は、その効果と実績で多くの受講生から高い評価を受けています。8月には180名を超える方々がこの講座にエントリーし、その人気と信頼の高さを証明しています。

この講座では、受講生が着実にスキルを身につけ、成長していることを実感できるカリキュラムを提供しています。プログラミングの基礎から実践的な応用まで、段階的に学べる内容は、初心者から経験者まで幅広く対応しています。また、学んだ知識をすぐに実践に移せる環境を整えており、学習の成果をリアルタイムで確認できるのも大きな特徴です。

テックジムの講座を受講した多くの方々が、「理解が深まった」「自信を持ってコードを書けるようになった」といった喜びの声を寄せています。これまでに培った経験と実績を活かし、受講生一人ひとりが成功への第一歩を踏み出せるよう全力でサポートしています。

あなたも、この成果を実感できるカリキュラムで、プログラミングスキルを確実に伸ばしてみませんか?

まずは無料体験からスタート!

プログラミングに興味はあるけれど、いきなり本格的な学習に踏み出すのは少し不安…そんな方に最適なのが、テックジムの無料体験です。まずは気軽に始めてみたい、という方のために、テックジムではデモレッスンを提供しています。

この無料体験では、実際のカリキュラムの一部を体験し、学習の進め方や講師のサポートを実感することができます。受講前に「自分に合っているかどうか」を確認できるので、安心してスタートを切ることができます。

プログラミングが全く初めての方も、すでにある程度の経験を持っている方も、まずはこの無料体験で、テックジムの学びを体感してみませんか?今すぐ始める一歩が、あなたの未来を大きく変えるかもしれません。

無料体験は随時開催中です。ぜひこの機会に、新たなスキルを手に入れるための第一歩を踏み出してみてください!

よかったらシェアしてね!
  • URLをコピーしました!
目次