ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). は、pandas の Series(列)を、and・or・not・if で「真か偽か」1つに決めようとしたときのエラーです。 列には値が複数あるので、全体が真か偽かを決められません。

書いたもの 直し方
df[(df.a > 1) and (df.b < 2)] df[(df.a > 1) & (df.b < 2)](and → &)
df[(df.a > 1) or (df.b < 2)] df[(df.a > 1) | (df.b < 2)](or → |)
df[not (df.a > 1)] df[~(df.a > 1)](not → ~)
df[df.a > 1 & df.b < 2](括弧なし) それぞれの条件を括弧で囲む
if df.a > 1: 「1つでも」なら .any()、「すべて」なら .all()
df[1 < df.a < 3] df[df.a.between(1, 3, inclusive='neither')] など

確認環境:pandas 3.0.2、numpy 2.4.4、Python 3.11(確認日 2026年10月11日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「truth value of a Series is ambiguousの直し方」

再現

df = pd.DataFrame({'a': [0, 2, 3], 'b': [1, 1, 5], 'name': ['佐藤', '鈴木', '高橋']})
df[(df.a > 1) and (df.b < 2)]
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

df.a > 1 は [False, True, True] という列です。 Python の and は、左側を「真か偽か」1つにしようとするので、エラーになりました(pandas 公式ドキュメントでも、if・and・or・not で起きるとされています)。

行ごとに「かつ」を計算するのが & です。

df[(df.a > 1) & (df.b < 2)]      # 鈴木の行(a=2、b=1)

括弧が無いと、& でも同じエラーになる

df[df.a > 1 & df.b < 2]
ValueError: The truth value of a Series is ambiguous. ...

& に直したのに、同じエラーになりました。 Python では、& が >・< より先に計算されるので、df.a > (1 & df.b) < 2 と解釈されます(pandas 公式ドキュメントの説明と同じ)。さらに x > y < z は Python の「連続した比較」で、中で and が使われるため、同じエラーになります。

書き方 結果
df[df.a > 1 & df.b < 2] エラー
df[(df.a > 1) & (df.b < 2)] 動く
df.query('a > 1 and b < 2') 動く(query の中では and が使える)

&・| でつなぐ条件は、1つずつ括弧で囲む、と覚えておきます。条件が多いときは、query で書くと読みやすくなります。

1 < a < 3 も同じ

df[1 < df.a < 3]                 # エラー(連続した比較が and になる)
df[(df.a > 1) & (df.a < 3)]      # 動く
df[df.a.between(1, 3)]           # 動く(1 以上 3 以下。両端を含む)

if で列を使ったとき

if df.a > 1:                     # エラー
    ...
if df:                           # The truth value of a DataFrame is ambiguous.
    ...

「どういう意味で真か」を、メソッドで明示します。

やりたいこと 書き方 結果(確認環境)
1つでも当てはまる (df.a > 1).any() True
すべて当てはまる (df.a > 1).all() False
データがあるか not df.empty True
1つだけの値を取り出す (df.loc[df.name == '鈴木', 'a'] > 1).item() True

値が1つしか無い Series でも、if に使うとエラーになりました。 1行だけ取り出したつもりでも、Series のままなら .item() で値を取り出します。

pandas 3.0 では、メッセージの a.bool() が使えない

pd.Series([True]).bool()
AttributeError: 'Series' object has no attribute 'bool'

エラーメッセージは a.bool() を勧めていますが、確認環境の pandas 3.0.2 では、bool() メソッドが無く、AttributeError になりました。 .item()・.any()・.all()・.empty を使います。

行ごとに分けて値を決めたいとき

df['size'] = 'big' if df.a > 1 else 'small'      # エラー
書き方 結果
np.where(df.a > 1, 'big', 'small') ['small', 'big', 'big']
df.apply(lambda r: 'big' if r.a > 1 else 'small', axis=1) 同じ(1行ずつ関数を呼ぶ)

if は1つの値にしか使えないので、列全体には np.where を使います。 apply の中の r.a は1つの値なので、if が使えます。

エラーにならない落とし穴:in と == None

s = pd.Series([10, 20, 30])
20 in s           # False(値に 20 があるのに)
2 in s            # True(行番号 2 がある)
20 in s.values    # True

in は、Series の値ではなく、行番号(インデックス)を調べました(pandas 公式ドキュメントでも同じ説明)。値を調べるなら s.values か s.isin([20]).any() を使います。

df = pd.DataFrame({'name': ['佐藤', None]})
df[df.name == None]      # 0 件(None の行があるのに)
df[df.name.isna()]       # 1 件

欠けている値は == None では見つからず、isna() で見つかりました。 どちらもエラーにならないので、結果の件数で気づくしかありません。

numpy の配列でも同じ

np.array([1, 2]) > 1 and np.array([1, 2]) < 3
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

numpy の配列では、メッセージの文が少し違います。 直し方は同じで、&・|・~ と括弧、または .any()・.all() です。

確認の手順(チェックリスト)

順番 確認すること 方法
1 and・or・not を使っていないか &・|・~ に
2 条件を括弧で囲んだか (条件1) & (条件2)
3 1 < 列 < 3 と書いていないか between、または2つの条件
4 if 列: と書いていないか .any()・.all()・.empty・.item()
5 列ごとに値を決めたい np.where
6 件数がおかしい in は行番号、欠損は isna()

よくある質問

Q. & と and の違いは何ですか。 A. and は、左右を1つの真偽値にしてから計算する Python の文法です。& は、pandas・numpy では「行ごと(要素ごと)の かつ」として動きます。列どうしの条件には & を使います。

まとめ

  • 列(Series)を、and・or・not・if で1つの真偽値にしようとしたエラー
  • &・|・~ を使い、条件を1つずつ括弧で囲む。括弧が無いと同じエラー
  • 1 < 列 < 3 も同じエラー。between か2つの条件に
  • if には .any()・.all()・.empty・.item()(pandas 3.0 では a.bool() が無い)
  • 列ごとの値は np.where
  • in は行番号を調べる、欠損は isna()(エラーにならない落とし穴)

参考・出典

確認日はいずれも 2026年10月11日です。

  • pandas documentation「Frequently Asked Questions (FAQ)」(Using if/truth statements with pandas):https://pandas.pydata.org/docs/user_guide/gotchas.html
  • pandas documentation「Indexing and selecting data」(Boolean indexing):https://pandas.pydata.org/docs/user_guide/indexing.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「truth value of a Series is ambiguousの直し方」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?