2016-09-29 3 views
3

値が与えられたxとyの間にあるかどうかに応じて、pandasデータフレームのすべての値をTrue/Falseにします。値がxとyの間であるデータフレーム内のセルを検索

「AND」演算子を使用する2つのデータフレームの組み合わせ、または「パンダ」の「間」の任意の機能がうまくいくでしょう。私は列をループし、pandas.Series.between(x、y)関数を呼び出さないことをお勧めします。

私は、xとyの間のすべての値をしたい、次のデータフレーム

>>> df = pd.DataFrame([{1:1,2:2,3:6},{1:9,2:9,3:10}]) 
>>> df 
    1 2 3 
0 1 2 6 
1 9 9 10 

を考えます。私は、たとえばで始めることができます。

>>> df > 2 
     1  2  3 
0 False False True 
1 True True True 

、その後、(原因演算子の優先順位に)括弧付き

>>> df < 10 
     1  2  3 
0 True True True 
1 True True False 

しかし、その後

>>> df > 2 and df < 10 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Users\Laurens Koppenol\Anaconda2\lib\site-packages\pandas\core\generic.py", line 731, in __nonzero__ 
    .format(self.__class__.__name__)) 
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

答えて

4

使用&を行い、andはどのように理解していませんしたがってブーリアンの配列を処理するために警告:

In [64]: 
df = pd.DataFrame([{1:1,2:2,3:6},{1:9,2:9,3:10}]) 
(df > 2) & (df < 10) 

Out[64]: 
     1  2  3 
0 False False True 
1 True True False 

それはapplybetweenを使用することが可能ですが、これは大規模なDFのために遅くなります:あなたはandorを使用してDFやシリーズを比較してみたときに、この警告を上げてしまいます

In [66]: 
df.apply(lambda x: x.between(2,10, inclusive=False)) 

Out[66]: 
     1  2  3 
0 False False True 
1 True True False 

注こと、及びこれらのビット演算子が正しく

0

betweenは、このための便利な方法があるの配列を治療するための方法を理解するようnot、あなたはそれぞれ&|、および~を使用する必要があります。ただし、これは一連のオブジェクトのみに適用されます。私たちはこれを回避するには、系列である各行(または列)で動作するapplyを使用するか、または、stack

使用stackbetweenunstack

df.stack().between(2, 10, inclusive=False).unstack() 

enter image description here

と直列にデータフレームを再構築
関連する問題