- 技術 💻
truth value of a Series is ambiguousの直し方
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期連続の黒字決算。