298

ブール値を含むpandasSeriesオブジェクトがあります。NOT各値の論理を含むシリーズを取得するにはどうすればよいですか?

たとえば、次を含むシリーズを考えてみましょう。

True
True
True
False

私が手に入れたいシリーズには以下が含まれます:

False
False
False
True

これはかなり単純なはずですが、どうやらモジョを置き忘れたようです =(

4

6 に答える 6

345

ブール シリーズを反転するには、次を使用します~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 のバージョンなど、多くの要因によって結果が異なる場合があります。

于 2013-04-14T12:20:27.223 に答える
18

私はそれを試してみます:

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
于 2013-04-14T10:53:08.627 に答える
6

以下も使用できます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
于 2013-04-14T10:58:01.740 に答える
0

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

于 2020-02-28T10:43:28.420 に答える