「条件に合うデータだけを抜き出したい」――この場面で必ず候補に挙がるのがfilter関数です。ところが、同じ“filter”でも、Python・JavaScript・Excelでは書き方だけでなく、戻り値の型や評価のされ方、空になったときの挙動まで微妙に異なります。その結果、「動いたのに結果が見えない」「空配列になった」「Excelで#CALC!が出て止まった」といったつまずきが起こりがちです。
本記事では、filterの基本概念を最短で整理したうえで、Pythonのfilter()、JavaScriptのArray.prototype.filter()、ExcelのFILTER関数を“同じ視点”で比較し、実務で頻出の複数条件(AND/OR)や空白除外、部分一致まで具体例で解説します。さらに、うまくいかないときの原因をチェックリストで切り分けられるようにまとめました。読み終えた頃には、自分の環境に合わせてfilterを迷わず使い、条件抽出をスムーズに組み立てられるようになります。
※本コンテンツは「記事制作ポリシー」に基づき、正確かつ信頼性の高い情報提供を心がけております。万が一、内容に誤りや誤解を招く表現がございましたら、お手数ですが「お問い合わせ」よりご一報ください。速やかに確認・修正いたします。
filter関数でできることを一言で理解する
filterが解決する典型パターン
filter関数(またはfilterメソッド、ExcelのFILTER関数)は、「大量のデータの中から、条件に合うものだけを残す」ための仕組みです。たとえば次のような場面で、ほぼ必ず登場します。
名簿から条件に合う人だけを抽出したい
例:部署が「営業」の人だけ、都道府県が「東京」の人だけ、入社年が2023年以降だけ。売上や在庫データを条件で絞りたい
例:売上が0より大きい行だけ、欠品フラグがある商品だけ、特定カテゴリだけ。ログやAPIレスポンスの配列から必要な要素だけを取り出したい
例:ステータスが200のものだけ、isActiveがtrueのものだけ、不要な空要素やnullを除去したい。“空白や欠損”を取り除きたい
例:空文字、NULL相当、未入力、0をどう扱うかを整理しながら、必要な値だけを残したい。
重要なのは、「条件に合うものだけを残す」という発想が、ExcelでもPythonでもJavaScriptでも共通だという点です。
一方で、同じ“filter”でも、戻り値の型や計算タイミング、空結果の扱い、例外の起き方が違うため、同じ感覚で使うとつまずきやすいのも事実です。先に“共通の型”を頭の中につくっておくと、環境が変わっても応用しやすくなります。
filterの基本ルールはシンプルです。
条件判定の結果が 真(true/TRUE)なら残す
条件判定の結果が 偽(false/FALSE)なら捨てる
このルールだけはどの環境でも同じです。あとは各環境の「真偽の作り方」と「結果の扱い方」を覚えるだけで、実戦投入できます。
同じ名前でも挙動が違う理由
“filter”は多くの環境で同じ名前を持っていますが、設計思想が違うため、次の点がズレます。このズレを言語化できると、つまずきの原因を自分で潰せるようになります。
戻り値の型が違う
Pythonの
filter()は「結果を取り出すための入れ物(イテレータ)」を返すことが多く、見た目では結果が確認しづらい場面があります。必要に応じてlist()化したり、forで回して消費したりします。JavaScriptの
Array.prototype.filter()は「新しい配列」を返します。呼び出した瞬間に結果が配列として確定します。Excelの
FILTER関数は「配列として返り、セルにスピル(展開)する」挙動が中心です。結果が複数セルへ広がる前提で設計されています。
評価タイミングが違う
Pythonは遅延評価の考え方が絡むため、「結果は作ったが、まだ計算・取得していない」状態があり得ます。
JavaScriptは通常、filterを呼び出した時点で新配列が作られます(もちろん、コールバック内で副作用を入れると話は別ですが、基本はその場で確定します)。
Excelはワークシート再計算の仕組みの中で結果が更新され、セル参照やスピル範囲の制約を受けます。
空結果の扱いが違う
PythonやJavaScriptは空になっても「空の入れ物」が返るのが基本です(空リスト、空配列など)。
Excelは空の配列が許容されない状況があり、
#CALC!などのエラーが見えることがあります。そのため、if_emptyの設計が大切になります。
“データの汚れ”への耐性が違う
文字列の前後スペース、全角半角、null/undefined、数値と文字列の混在など、現実のデータはきれいではありません。
どの環境でも「まずデータの形を整える」か「条件側で吸収する」かが勝負になりますが、吸収の仕方が環境ごとに違うため、同じ発想でも書き方が変わります。
この4点を意識しておくだけで、「なんで動かないのか」「なんで空になったのか」を冷静に切り分けられるようになります。
filter関数の違いが一目でわかる比較表
引数と戻り値の違い
ここでは“仕組みの違い”を、実務で迷いやすい点に絞って整理します。細かな仕様は環境ごとにありますが、まずは次の比較を押さえてください。
| 環境 | 呼び方 | 対象 | 条件の書き方 | 戻り値 | 空結果 |
|---|---|---|---|---|---|
| Python | filter(function, iterable) | iterable(リスト等) | functionが真なら残す | イテレータ(取り出して使う) | 空のイテレータ |
| JavaScript | array.filter(callbackFn) | 配列 | callbackが真なら残す | 新しい配列 | 空配列 [] |
| Excel | =FILTER(array, include, [if_empty]) | 範囲/配列 | includeがTRUEの行/列を返す | スピルする配列 | if_empty未指定だとエラーになり得る |
この表を見て最初に意識すべきは、「引数の形が違う」ことではなく、「戻り値の形が違う」ことです。
filterは“抽出”なので、抽出した後は大抵、次の処理につなげます。たとえば「抽出した結果を集計する」「抽出した結果を画面表示する」「抽出した結果を別ファイルに出す」などです。そのとき、戻り値が“配列そのもの”か、“取り出し装置”か、“シートに展開される配列”かで、後工程の書き方が変わります。
Python:取り出し装置(イテレータ) → 必要に応じてリスト化して扱う
JavaScript:配列 → そのままmap/reduceへつなげる
Excel:スピル配列 → 参照先(展開先のセル範囲)に注意しつつ別関数に渡す
「抽出できたのに次の処理が書けない」問題は、ほぼこの違いが原因です。
評価タイミングと副作用の考え方
filterは本来、“副作用がない”形で使うのが安全です。つまり「判定するだけ」で、外部の状態を書き換えないという方針です。理由は単純で、filterは繰り返し処理の一種であり、判定の回数や順序、実行タイミングが環境によって違い得るからです。
Pythonでは、filterの結果をすぐに取り出さずに放置すると、後で取り出したタイミングで判定が走る場合があります。副作用があると「いつ実行されたか」が読みづらくなります。
JavaScriptでも、filterのコールバック内で外部変数を更新すると、可読性が落ちます。filterは「抽出」だけに集中させ、更新や集計はreduceなどに分ける方がトラブルが減ります。
Excelでは、再計算のタイミングで同じ式が繰り返し評価されます。副作用そのものは書きにくいですが、条件式が重いとシート全体が遅くなるなど、別種の問題が出ます。
副作用を避けると、filterのコードや数式が「判定ロジック」だけになり、レビューやメンテナンスも楽になります。
また、判定ロジックだけになっていれば、別の環境へ移植するときも、条件の意味だけを移せば良いので作業が軽くなります。
Pythonのfilter関数の使い方
基本構文と最小例
Pythonのfilter()は、次の形で使います。
filter(function, iterable)
iterableはリスト、タプル、集合、辞書のキー、文字列など、反復できるもの全般です。functionは「要素を受け取り、真偽を返す関数」です。真なら残り、偽なら捨てられます。
例:偶数だけ残す
ここで重要なのは、filter()の返り値が“そのままではリストではない”ことです。list()で包むと結果が確定して見えるようになります。
逆に言えば、巨大データを扱うときは「必要な分だけ取り出す」方向へ寄せられるのがPythonの強みです。
次のようにforで回す形でも問題ありません。
「結果を全部保持する必要がない」「順に処理して捨てる」タイプのタスクなら、この書き方が自然です。
functionがNoneのときの意味
Pythonのfilter()には、functionをNoneにできる特殊な使い方があります。これは「要素そのものの真偽で判定する」モードです。
便利なのは、次のような「空っぽを取り除きたい」ケースです。
空文字
""None0空リスト
[]空辞書
{}False
ただし、実務ではここが罠になります。
たとえば「0は正当な値として残したい」のに消えてしまう、という問題です。売上データ、在庫数、点数など、0は意味を持ちます。
0を残したい場合は、Noneや空文字だけ除外する条件関数を明示する方が安全です。
このように、「何を“空”と見なすか」を自分のデータに合わせて定義するのが、事故を減らすコツです。
内包表記とどちらを使うか
Pythonでは、filterと内包表記(リスト内包)が同じ目的で使われることが多く、どちらを選ぶべきか迷いがちです。判断基準を決めておくと、統一感が出ます。
内包表記が向いている場面
条件が短い
読みやすさを優先したい
結果を最終的にリストとして扱うことが確定している
filterが向いている場面
既に用意された判定関数を再利用したい(例:バリデーション関数)
結果を遅延評価のまま次へ流したい(巨大データ、ストリーム処理)
コードの責務を分けたい(判定関数を単体テストしやすくしたい)
実務でおすすめなのは、「最終的にリストが欲しいなら内包表記」「遅延評価を活かしたいならfilter」くらいのシンプルな基準です。
ただし、チームで読みやすさを最優先するなら、内包表記に寄せた方が迷いは減ります。
よくある失敗と直し方
Pythonのfilter()で多い失敗は、仕様の誤解というより「取り扱いの癖」を知らないことで起きます。代表例と対処をまとめます。
失敗1:表示すると“filter object”になって結果が見えない
症状:
print(filter(...))すると<filter object at ...>のように出る原因:filterはイテレータを返すため
対処:
list()化する、もしくはforで回す
失敗2:2回使おうとして空になる
症状:一度list化した後、もう一度同じfilter結果を使うと何も出ない
原因:イテレータは消費される
対処:複数回使うなら最初に
list()へ確定して保持する
失敗3:function=Noneで意図せず0やFalseが消えた
対処:「何を除去したいか」を明文化し、条件関数を自作する
失敗4:判定関数が例外を起こして止まる
例:数値だと思っていたら文字列が混じっていて比較で落ちる
対処:前処理で型を整える、または条件関数で型分岐する
データ品質が安定しない現場では、filter以前に「前処理」と「型の定義」が成果を左右します。filterはあくまで抽出であり、抽出条件が正しく評価される土台が必要です。
JavaScriptのfilter関数の使い方
基本構文と最小例
JavaScriptのfilterは、配列に対して使うのが基本です。
array.filter(callbackFn)
callbackFnは、要素ごとに呼び出され、真(truthy)を返した要素だけが結果配列に入ります。
この書き方の強みは、「返り値が配列なので、そのまま次の処理につなげやすい」ことです。たとえば、抽出してから変換するパイプラインが自然に書けます。
このように、filterは「残す」、mapは「変える」、という役割分担がはっきりすると読みやすくなります。
第二引数thisArgの使いどころ
filter(callbackFn, thisArg)のように第2引数を渡すと、callback内のthisとして参照できます。頻繁に使うものではありませんが、次のような状況で役立つことがあります。
コールバック内で、設定値(閾値など)を
thisとして渡したい関数を別途定義していて、呼び出し側で
thisを差し込みたい
ただ、最近のJavaScriptでは、アロー関数やクロージャを使えばthisに頼らずとも書ける場合が多いです。thisは誤解が生まれやすい要素でもあるため、チームの規約や可読性を優先して決めるのがおすすめです。
疎配列と空要素の注意
JavaScriptの配列は、いわゆる「疎配列(穴あき配列)」を作れてしまいます。たとえば次のように、要素が存在しないインデックスがある配列です。
このとき、filterは「存在しない要素(空スロット)」に対してコールバックが呼ばれないことがあります。つまり、空スロットを“falseとして弾く”のではなく、そもそも判定が実行されないという挙動が混ざります。
データが外部由来で、配列が期待通りに詰まっている保証がない場合は、次のどちらかを検討すると安全です。
配列を正規化してからfilterする(穴を埋める、nullを明示的に入れるなど)
入力を作る段階で穴ができないようにする(pushで追加、mapで作り直す等)
空要素の扱いは、結果が合っているように見えて「実は判定していない要素がある」という形で潜みます。原因調査が長引きやすいポイントなので、早めに意識しておくと得です。
mapやreduceとの使い分け
JavaScriptでfilterを使いこなすコツは、「何をしているのか」を関数の名前で表せるようにすることです。役割が分かれると読みやすさが上がります。
filter:残す/捨てる
map:形を変える
reduce:集計・結合・複雑な変換
よくある悪い例は、filterの中で集計や更新までやろうとすることです。たとえば「条件に合うものを抽出しつつ合計も増やす」など。短期的には動きますが、後から読んだ人が意図を追いにくくなります。
おすすめは、次のような段階分離です。
filterで抽出
mapで必要な形へ変換
reduceで集計
こうしておくと、途中結果のデバッグもしやすく、条件だけ差し替えるのも簡単です。
ExcelのFILTER関数の使い方
基本構文とスピルの考え方
ExcelのFILTER関数は、表や範囲から条件に合う行(または列)だけを抽出します。構文は次のとおりです。
=FILTER(array, include, [if_empty])
それぞれの役割は次の通りです。
array:抽出対象の範囲(例:A2:D100)
include:残すべき行(または列)をTRUE/FALSEで示す条件(配列)
if_empty:該当がないときに表示する値(例:”該当なし”、または””)
Excelで最初につまずきやすいのは、includeが「単一のTRUE/FALSE」ではなく、「行ごとにTRUE/FALSEが並ぶ配列」になっている点です。
たとえば、A2:A100の各セルが条件を満たすかどうかを判定し、その結果のTRUE/FALSE列がincludeになります。これがarrayの行数と一致している必要があります。
また、FILTERの結果は「スピル」します。つまり、結果が複数行・複数列なら、その分だけセルが下や右に広がります。
スピル先に既に値があると展開できず、エラーになったり意図しない挙動に見えたりします。FILTERを置く場所は、必ずスピル範囲を確保できる位置にしてください。
複数条件ANDとORの書き方
FILTERを実務で使うと、ほぼ確実に「複数条件」が必要になります。Excelでは、includeを作るときに条件を組み合わせます。
代表的な組み合わせは以下です。
AND条件:
(条件1) * (条件2)OR条件:
(条件1) + (条件2)
この書き方は、TRUE/FALSEが内部的には1/0として扱われることを利用しています。
ANDは「両方TRUEのときだけ1」、ORは「どちらかがTRUEなら1」になり、結果としてTRUE/FALSE配列を作れます。
例:A列が「東京」かつB列が「営業」
例:A列が「東京」または「大阪」
注意点として、OR条件で「2」になるケースがあります(両方TRUEなら1+1=2)。ただし、includeは「0以外」をTRUEとして扱うので通常問題になりません。
それでも「論理値として綺麗にしたい」場合は、>0で丸める方法があります。
空結果と#CALC!を避けるif_empty
FILTERは便利ですが、「該当が0件」のときの扱いが重要です。
if_emptyを省略すると、環境や状況によってはエラー表示(例:#CALC!)になり、見た目にも運用にも悪影響が出ます。検索条件が変動するシートでは特に、0件は普通に起こります。
そのため、if_emptyは“原則指定”がおすすめです。用途に応じて使い分けます。
ユーザーに明示したい:
"該当なし"、"対象データがありません"見た目を崩したくない:
""(空文字)別計算に使いたい:0件でも後段がエラーにならないよう、後段の数式も合わせて設計する
たとえば、FILTERの結果を別関数で集計する場合、空文字を返すと集計側が意図通りにならないことがあります。
その場合は「0件時は0を返す」「0件時はNAを返して後段でIFERRORする」など、シート全体の設計として扱うのが安定します。
部分一致や空白除外の定番レシピ
FILTERでよく使う条件パターンは、暗記しておくと作業が速くなります。ここでは頻出の“そのまま使える”形をまとめます。
1) 空白除外
B列が空でない行だけを抽出します。未入力が混ざる名簿や、空白行が入った表に有効です。
2) 数値条件(以上・以下)
D列が1000以上の行を抽出します。売上や数量での絞り込みに使えます。
3) 部分一致(含む)SEARCHは見つかった位置を数値で返し、見つからないとエラーになります。そこでISNUMBERと組み合わせてTRUE/FALSEにします。
4) 複数条件の組み合わせ(空白除外 + 数値条件)
5) データの汚れ対策(前後スペース)
文字列比較が合わない原因の定番が、前後スペースです。可能ならデータ側を整形し、難しいなら条件側でTRIMを挟みます。
ただし、TRIMを大量範囲に使うと再計算が重くなることがあります。頻繁に使うなら、別列に整形済みの補助列を用意する方がシートは軽くなります。
filter関数がうまくいかないときのチェックリスト
結果が空になる
結果が空になるのは、必ずしも失敗ではありません。条件に合うデータが本当に無い可能性もあります。問題は「あるはずなのに空」になったときです。空の原因は、だいたい次のどれかに収束します。
1) 条件が逆になっている
「残したいものがTrue」になっていない
例:x == 0のつもりがx != 0になっている
2) 型や表記が違う
数値のつもりが文字列だった
例:JSで"10" > 2のような比較、Excelで数字が文字列として入っている全角半角、前後スペース、表記ゆれ
例:「東京 」と「東京」
3) null/undefined/空文字の混在
期待していない空値が混ざり、判定が落ちる/Falseになる
4) 条件の対象範囲がずれている(Excelで多い)
arrayとincludeの行数が一致していない
参照がずれている(絶対参照・相対参照)
対処の基本は、「条件が正しいか」ではなく「条件が何をTrueにしているか」を可視化することです。
Python/JS:途中の判定結果をログ出力する
Excel:条件式だけを別セルで計算し、TRUE/FALSE配列が意図通りか確認する
Excelなら、include式を単独でセルに入れてみるだけでも、原因が見えやすくなります。
型が違う、表示できない
「抽出できたはずなのに使えない」ケースは、戻り値の扱いと表示の都合で起こります。
Pythonで多い
filterはイテレータなので、表示や再利用には
list()化が必要になる場面があります。さらに、イテレータは一度消費すると空になります。2回使うなら最初にリストへ確定して保持するのが安全です。
Excelで多い
スピル先に値がある
結果のサイズが変動し、参照しているセル範囲が追随できていない
別関数に渡している箇所が「固定範囲参照」になっている
Excelでは、FILTERの結果を他の関数で参照する場合、スピル範囲参照(A1#のような記法)を使える環境なら活用すると壊れにくくなります(使用可否はExcelのバージョンや環境に依存します)。
速度が遅い、重い
filter自体は軽い処理に見えますが、データ量が増えると次の要因で重くなりがちです。
Python/JavaScript
判定関数が重い(正規表現、複雑な条件、外部I/Oなど)
何度も同じ判定を繰り返している(前処理で簡略化できる)
不必要に巨大な配列を作っている(中間配列が多い)
対策としては、
判定関数を簡単にする
前処理で絞り、必要な範囲だけfilterする
filter→map→reduceのように段階を分け、中間が必要かを見直す
が効果的です。
Excel
参照範囲が広すぎる(列全体参照の乱用など)
条件式が重い(TRIM/SEARCH/置換などを大範囲に実行)
同じ計算を複数箇所で繰り返している
Excelでは、次が即効性のある改善策になります。
対象範囲を必要最小限にする(例:A:AではなくA2:A5000)
重い整形は補助列に一度だけ行い、FILTERでは軽い条件を使う
条件が複雑なら、段階的にフィルタして分割する
最後に、共通のチェックリストをまとめます。トラブル時は、上から順に潰すと復旧が早いです。
条件は「残したいものが真」になっている
データ型(数値/文字列/null相当)を把握している
表記ゆれ(スペース、全角半角、大小文字)を想定している
空結果をどう扱うか(表示/後段計算)を設計している
戻り値の型(イテレータ/配列/スピル)を理解して次に渡している
重い処理は前処理や補助列に逃がしている
よくある質問
filterは元データを変更しますか
基本的に、filterは「元データを残したまま抽出結果を得る」用途で使われます。ただし、“元データを直接変更しない”という意味であって、“元データの要素が参照型の場合に影響がゼロ”とは限りません。誤解が多いので環境別に整理します。
Python:
filter()は抽出結果を返すだけで、元のリストを直接書き換えるものではありません。
ただし、要素がオブジェクトで、そのオブジェクト自体を書き換えれば参照先には影響します。JavaScript:
filter()は新しい配列を返し、元配列自体は変更しません。
ただし、要素がオブジェクトなら参照は共有されるため、オブジェクトの中身を更新すると影響は出ます。Excel:FILTERは元の表を削るのではなく、条件に合う結果を別セルに表示します。元データの値はそのままです。
つまり「配列や表の“形”を変えるのではなく、“見たいものだけ見える形”を作る」のがfilterの役割だと捉えると正確です。
複数条件はどう書きますか
複数条件の基本は「条件をAND/ORでつなぐ」ことです。ただし、つなぎ方は環境で少し違います。
Python:
and/orJavaScript:
&&/||Excel:ANDは
*、ORは+(必要なら>0で整形)
複数条件が増えるほど、「条件を一気に書く」より「補助列や関数で条件を分割して可視化する」方が安全です。
特にExcelでは、条件が複雑になったら“条件用の列”を作って、TRUE/FALSEを目視できるようにするとトラブルが減ります。
初心者は何から覚えるべきですか
最短で身につけるなら、次の順番が効果的です。
「Trueなら残る」を固定する
何をTrueにすれば残るのか、という視点を持つだけで設計が安定します。最小例を動かす
偶数抽出、空白除外など、単純な例で成功体験を作ります。定番の条件を1つ増やす
AND/OR、部分一致、数値範囲など、実データに近い条件を追加します。空結果と戻り値を理解する
Pythonならイテレータ、JSなら配列、Excelならスピルとif_empty。ここを押さえると「動いたのに使えない」が消えます。データの汚れ対策を覚える
表記ゆれ、スペース、null相当、型混在は避けられません。最終的にはここが実務力になります。
filterは“抽出”という単機能に見えますが、実際は「条件設計」「データ整形」「結果の扱い」の3点セットで完成します。最初から完璧にやる必要はありません。小さな条件で成功させ、少しずつ“現実のデータの癖”に対応できるようにしていくのが近道です。