DataFrameを使っていて,条件を複数指定するとこんな感じでエラーが出ることがあると思います。
df[df['var1'] >= 0 and df['var2'] <= 0.5] ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
正しい方法を覚えればどうってことないエラーなんですが,ときどき忘れてハマってしまうのでNGの場合と正しい場合を書いておきます。
Qiitaにも書いたことがあるのですが,こちらに整理して書き直します。
準備
import numpy as np import pandas as pd cols = ['var1', 'var2', 'var3', 'var4'] df = pd.DataFrame(np.random.randn(4, 4), columns=cols) df var1 var2 var3 var4 0 -0.694514 0.641021 1.268371 0.124202 1 2.721851 -0.763487 -0.888968 0.313504 2 -0.049970 -1.329161 1.174498 0.280841 3 -0.412090 0.705316 -0.094005 0.688624
NG集
# NGパターン1:条件を括弧でくくらずandで接続 df[df['var1'] >= 0 and df['var2'] <= 0.5] ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). # NGパターン2:条件を括弧でくくりandで接続 df[(df['var1'] >= 0) and (df['var2'] <= 0.5)] ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). # NGパターン3:条件を括弧でくくらず&記号で接続 df[df['var1'] >= 0 & df['var2'] <= 0.5] TypeError: cannot compare a dtyped [float64] array with a scalar of type [bool]
OKの場合
# OKパターン:条件を括弧でくくり&記号で接続 df[(df['var1'] >= 0) & (df['var2'] <= 0.5)] var1 var2 var3 var4 1 2.721851 -0.763487 -0.888968 0.313504
まとめ
エラーを回避するためには,以下の書き方でないといけないです。
- 各条件を括弧でくくる
- and/orではなく記号(&や|)で接続