2017-07-21 21 views
1

私はいくつかの列を持つpandas Datarameを持っています。特定の列の値が特定の値より小さい行のみを印刷したかったのです。それが正常にデータフレームを作成し 論理と演算子を使ってPandasでDataFrameを作成

df[df.marks < 4.5] 

が、今私は、その値が一定の範囲内にあるカラムだけを追加したいので、私はこの試みた::だから私はやった

df[(df.marks < 4.5 and df.marks > 4)] 

が、それは私に与えているがエラー:

712   raise ValueError("The truth value of a {0} is ambiguous. "  
713       "Use a.empty, a.bool(), a.item(), a.any() or a.all()." 
--> 714       .format(self.__class__.__name__)) 
715 
716  __bool__ = __nonzero__  
ValueError: The truth value of a Series is ambiguous. Use a.empty, 
a.bool(), a.item(), a.any() or a.all(). 

どうすれば解決できますか?そして最初は、すべての行を繰り返して真理値をチェックし、データフレームに行を追加することも考えましたが、そうではないようです。もしそうなら、データフレームの行をどのように追加しますか?

答えて

2

使用

df[(df.marks < 4.5) & (df.marks > 4)] 

はわずかにより一般的には、アレイの論理演算は、個々の条件の周りに括弧を使用して合成されます。

これはNumPyで設定され、配列にブール演算子が設定され、Pandasがその動作をコピーした方法です。

+0

ありがとう、ありがとう –

+0

@Evertには理由がある '&' works and 'and' does not? – ash

+1

@ashこれはNumPy側の設計上の選択です。プレーンなPythonでは、 'と'はリストに作用できます: '[1,2,3]と[]'は 'False'と評価されます。NumPy配列の場合、これは正しく動作しません(警告が表示されます)。混乱を避けるため、NumPyはビット単位のAND演算子 '&'を選択しました。 – Evert

0

私は以前にその問題に遭遇しました。原因は100%ではありませんが、データフレームオブジェクトは複数の条件が一緒に好きではありません。

df[(df.marks < 4.5 and df.marks > 4)] -> will fail 

通常、このような処理を行うと問題が解決します。

このプロジェクトは現在私の頭の上にはありませんが、私はそれらを別々に引用していると思います。

(a < b) & (c > d) 
OR-組合せについて同様

、又は2つの以上の条件:

+0

うーん、 'データフレームオブジェクトは複数の条件を好きではありません。一緒に」 - 指定することはできますか? – jezrael

+0

はい、今私は理解しています。あなたは間違った構文を使用しています。コメントにEvertはなぜ '&'が必要なのかを説明します。 – jezrael

+0

@evertが最善の答えを提供しました。上記の例を参照してください。条件を親にする必要があります –

1

まず、Evert's solutionがいいです。

私は別の2つの可能な解決策を追加:queryで...

df = pd.DataFrame({'marks':[4.2,4,4.4,3,4.5]}) 
print (df) 
    marks 
0 4.2 
1 4.0 
2 4.4 
3 3.0 
4 4.5 

df = df[df.marks.between(4,4.5, inclusive=False)] 
print (df) 
    marks 
0 4.2 
2 4.4 

... betweenとを

df = df.query("marks < 4.5 & marks > 4") 
print (df) 
    marks 
0 4.2 
2 4.4