ブール値を含むpandasSeries
オブジェクトがあります。NOT
各値の論理を含むシリーズを取得するにはどうすればよいですか?
たとえば、次を含むシリーズを考えてみましょう。
True
True
True
False
私が手に入れたいシリーズには以下が含まれます:
False
False
False
True
これはかなり単純なはずですが、どうやらモジョを置き忘れたようです =(
ブール値を含むpandasSeries
オブジェクトがあります。NOT
各値の論理を含むシリーズを取得するにはどうすればよいですか?
たとえば、次を含むシリーズを考えてみましょう。
True
True
True
False
私が手に入れたいシリーズには以下が含まれます:
False
False
False
True
これはかなり単純なはずですが、どうやらモジョを置き忘れたようです =(
ブール シリーズを反転するには、次を使用します~s
。
In [7]: s = pd.Series([True, True, False, True])
In [8]: ~s
Out[8]:
0 False
1 False
2 True
3 False
dtype: bool
Python2.7、NumPy 1.8.0、パンダ 0.13.1 を使用:
In [119]: s = pd.Series([True, True, False, True]*10000)
In [10]: %timeit np.invert(s)
10000 loops, best of 3: 91.8 µs per loop
In [11]: %timeit ~s
10000 loops, best of 3: 73.5 µs per loop
In [12]: %timeit (-s)
10000 loops, best of 3: 73.5 µs per loop
Pandas 0.13.0 以降、 Series は のサブクラスではなくなりましたnumpy.ndarray
。のサブクラスになりpd.NDFrame
ました。これは、 がまたはnp.invert(s)
ほど速くない理由と関係があるかもしれません。~s
-s
警告:timeit
ハードウェア、コンパイラ、OS、Python、NumPy、Pandas のバージョンなど、多くの要因によって結果が異なる場合があります。
私はそれを試してみます:
In [9]: s = Series([True, True, True, False])
In [10]: s
Out[10]:
0 True
1 True
2 True
3 False
In [11]: -s
Out[11]:
0 False
1 False
2 False
3 True
以下も使用できますnumpy.invert
。
In [1]: import numpy as np
In [2]: import pandas as pd
In [3]: s = pd.Series([True, True, False, True])
In [4]: np.invert(s)
Out[4]:
0 False
1 False
2 True
3 False
編集:パフォーマンスの違いは、Ubuntu 12.04、Python 2.7、NumPy 1.7.0 で表示されますが、NumPy 1.6.2 を使用すると存在しないようです:
In [5]: %timeit (-s)
10000 loops, best of 3: 26.8 us per loop
In [6]: %timeit np.invert(s)
100000 loops, best of 3: 7.85 us per loop
In [7]: %timeit ~s
10000 loops, best of 3: 27.3 us per loop
NumPy は、入力をブール値にキャストするため、処理が遅くなります (つまり、None と 0 が False になり、それ以外はすべて True になります)。
import pandas as pd
import numpy as np
s = pd.Series([True, None, False, True])
np.logical_not(s)
あなたにあげる
0 False
1 True
2 True
3 False
dtype: object
一方 ~s はクラッシュします。ほとんどの場合、チルダは NumPy よりも安全な選択です。
パンダ 0.25、NumPy 1.17