Panda Serisi'nin element-mantıksal DEĞİLDİĞİNİ nasıl elde edebilirim?


230

SeriesBoole değerleri içeren bir panda nesnesi var . NOTHer bir değerin mantığını içeren bir seriyi nasıl edinebilirim ?

Örneğin, aşağıdakileri içeren bir dizi düşünün:

True
True
True
False

Almak istediğim dizi şunları içerir:

False
False
False
True

Bu oldukça basit olmalı, ama görünüşe göre mojo = (


1
Verilerin objectaşağıdaki cevapların çalışması için tür içermemesi önemlidir , bu nedenle ~ df.astype('bool')
şunları

Bu yazıda tüm mantıksal operatörler hakkında yazdım . Mesaj aynı zamanda alternatifler de içeriyor.
cs95

Yanıtlar:


260

Bir Boole Serisini ters çevirmek için şunu kullanın~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, Pandalar 0.13.1 kullanarak:

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

Pandalar 0.13.0 itibariyle, Seriler artık numpy.ndarray; onlar şimdi alt sınıfları pd.NDFrame. Bunun neden ya da bu np.invert(s)kadar hızlı olmadığıyla ilgili bir şey olabilir .~s-s

Uyarı: timeitsonuçlar, donanım, derleyici, işletim sistemi, Python, NumPy ve Panda sürümleri gibi birçok faktöre bağlı olarak değişebilir.


Tam olarak not edildi. Çok yavaş olmanın yanı sıra, tilde ve arasındaki fark -nedir?
blz

Wierd, aslında tildebelgelerinde belirtildiği gibi test ettim , ama aynı şeyi yapmadı np.invert: S
root

@blz: numpy 1.6.2, performansını çalışan, benim Ubuntu makinede En azından np.invert(s), ~sve -shepsi aynı.
unutbu

@ root: Timeit sonuçlarımızda neden bu kadar büyük bir tutarsızlık olduğundan emin değilim, ama kesinlikle olabilir. Hangi işletim sistemini ve NumPy sürümünü kullanıyorsunuz?
unutbu

Ayrıca Ubuntu üzerinde, ancak NumPy 1.7.0 kullanarak ... ( np.bitwise_not(s)ile aynı performansı gösterir np.inverse).
kök

32

@ unutbu'nun cevabı açık, sadece maskenizin 'nesne' değil dtype bool olması gerektiğini belirten bir uyarı eklemek istedim. Yani maskenizin hiç bir nanı olmadı. Buraya bakın - maskeniz şimdi nan-free olsa bile, 'nesne' tipi olarak kalacaktır.

Bir 'nesne' serisinin tersi bir hata atmaz, bunun yerine beklediğiniz gibi çalışmayan bir çöp maskesi alırsınız.

In[1]: df = pd.DataFrame({'A':[True, False, np.nan], 'B':[True, False, True]})
In[2]: df.dropna(inplace=True)
In[3]: df['A']
Out[3]:
0    True
1   False
Name: A, dtype object
In[4]: ~df['A']
Out[4]:
0   -2
0   -1
Name: A, dtype object

Bu konuda meslektaşları ile konuştuktan sonra bir açıklama var: Görünüşe göre pandalar bitsel operatöre geri dönüyor:

In [1]: ~True
Out[1]: -2

@Geher'in dediği gibi, ~ ile ters yapmadan önce astype ile boole dönüştürebilirsiniz

~df['A'].astype(bool)
0    False
1     True
Name: A, dtype: bool
(~df['A']).astype(bool)
0    True
1    True
Name: A, dtype: bool

örneğinizde, çıkış ints maskesi istediğiniz bool serisine dönüştürülebilir, .astype(bool)örneğin~df['A'].astype(bool)
geher

Bu çalışıyor çünkü vs vs astype(bool)önce~ ~df['A'].astype(bool)(~df['A']).astype(bool)
JSharm

16

Sadece deniyorum:

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

Kelimenin tam anlamıyla dışında her operatörü denedim -! Bunu bir dahaki sefere aklımda tutacağım.
blz

6

Ayrıca şunları kullanabilirsiniz 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

DÜZENLEME: Performans farkı Ubuntu 12.04, Python 2.7, NumPy 1.7.0'da görünüyor - NumPy 1.6.2 kullanılarak var görünmüyor:

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

farklı bir platformda doğru olmayabilir. Win 7, python 3.6.3 numpy 1.13.3, pandalar 0.20.3, (-s) en hızlı, (~ s) ikinci ve np.invert (s) en yavaş olan
gaozhidf

0

NumPy, girdiyi boole değerlerine çevirdiğinden yavaştır (bu nedenle None ve 0 False olur ve diğer her şey True olur).

import pandas as pd
import numpy as np
s = pd.Series([True, None, False, True])
np.logical_not(s)

sana verir

0    False
1     True
2     True
3    False
dtype: object

Oysa ~ s çökecekti. Çoğu durumda tilde NumPy'den daha güvenli bir seçim olacaktır.

Pandalar 0.25, NumPy 1.17

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.