主な内容は以下の通りです:
- パフォーマンスの最適化: 膨大なレコードを処理する際、メモリ使用量を抑えつつ高速にフィルタリングを行うための条件設定やアルゴリズムの考え方。
- 効率的なクエリ・条件指定: 不要なスキャンを防ぎ、必要なデータだけを正確に抽出するためのフィルタリング構文やパラメータの指定方法。
- 実用的なコード例: 実際のシステムやデータベース連携において、どのようにフィルタリング処理を実装すべきかのサンプルコードの提示。
🧩 ビッグデータをフィルタリング
df_a は数万件以上の行数と100を超える列を持つ大規模なデータフレームであり、その中から特定の name に一致するデータのみを抽出したい場合がある。 このとき、抽出対象となる name の一覧が df_b の name 列に格納されている場合、Pandas の isin() メソッドを利用することで効率的に絞り込みを行うことができる。
🌱 isin()メソッドとは
isin() は、指定した値の集合に各要素が含まれているかを判定し、真偽値(True / False)を返すメソッドである。
df_a['name']の値がdf_b['name']に含まれている行のみを残す場合:
→df_a['name'].isin(df_b['name'])を条件として使用する。
🔍 一致するものを残す
1
df_a_filtered_isn = df_a[df_a['name'].isin(df_b['name'])]
この処理により、df_b に登録されている約100件の name と一致する行だけが df_a から抽出される。df_a の行数や列数が多い場合でも、isin() はベクトル化された処理として実行されるため、Python の for ループで1件ずつ比較する方法よりも高速かつ簡潔に実装できる。
🔍 逆方向にフィルタリングする(一致しないものを残す)
df_b の name 列に登録されている値を除外条件とし、df_a の name 列が df_b に存在しないレコードのみを抽出する。 実装には Pandas の isin() メソッドと否定演算子 「~」 を使用する。
1
df_a_filtered_notin = df_a[~df_a['name'].isin(df_b['name'])]
📋 元データ df_a
No name score
1 A 80
2 B 90
3 C 75
4 D 88
5 E 92
📋 元データ df_b
name
A
D
E
① isin() による判定
1
df_a['name'].isin(df_b['name'])
❶ df_a[‘name’] の各値について、「df_b[‘name’] に存在するか?」を確認します。
❷ df_a[‘name’] df_b に存在するか
A False
B True
C False
D True
E True
結果は以下のような Boolean 型の Series になります。
0 False
1 True
2 False
3 True
4 True
dtype: bool
② True の行だけを抽出
1
2
3
df_a[
df_a['name'].isin(df_b['name'])
]
実際には次のようなイメージです。
条件
行1 A → False ✕
行2 B → True ○
行3 C → False ✕
行4 D → True ○
行5 E → True ○
③ 抽出結果
1
df_a_filtered
No name score
2 B 90
4 D 88
5 E 92
🚀 SQL と比較する
1
df_a_filtered = df_a[~df_a['name'].isin(df_b['name'])]
これは SQL の次の条件とほぼ同じ意味です。
1
WHERE name NOT IN (...)