【Python】pandas.DataFrameで複数条件指定時のエラー回避 - 加賀百万石ですが何か?

【Python】pandas.DataFrameで複数条件指定時のエラー回避

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ではなく記号(&や|)で接続
スポンサーリンク