У меня есть Series
объект Pandas, содержащий логические значения. Как я могу получить серию, содержащую логическое NOT
каждого значения?
Например, рассмотрим серию, содержащую:
True
True
True
False
Ряд, который я хотел бы получить, содержал бы:
False
False
False
True
Кажется, это должно быть достаточно просто, но, видимо, я потерял моё умение = (
object
типов для ответов ниже, чтобы работать, поэтому используйте:~ df.astype('bool')
Ответы:
Чтобы инвертировать логическую серию, используйте
~s
:Используя Python2.7, NumPy 1.8.0, Pandas 0.13.1:
Начиная с Pandas 0.13.0, Серии больше не являются подклассами
numpy.ndarray
; теперь они подклассыpd.NDFrame
. Это может иметь какое-то отношение к тому, почемуnp.invert(s)
это не так быстро, как~s
или-s
.Предостережение:
timeit
результаты могут отличаться в зависимости от многих факторов, включая аппаратное обеспечение, компилятор, ОС, Python, NumPy и версии Pandas.источник
-
?tilde
как было упомянуто в документации, но он не работал так же, какnp.invert
: Snp.invert(s)
,~s
и-s
все же.np.bitwise_not(s)
работает так же, какnp.inverse
).Ответ @ unutbu точен, просто хотел добавить предупреждение, что ваша маска должна быть dtype bool, а не 'object'. Т.е. у твоей маски не могло быть ни одной няньки. Смотрите здесь - даже если ваша маска теперь не содержит наночастиц, она останется типом «объект».
Инверсия серии 'object' не выдаст ошибку, вместо этого вы получите мусорную маску int, которая не будет работать так, как вы ожидаете.
После разговора с коллегами об этом у меня есть объяснение: похоже, панда возвращается к побитовому оператору:
Как говорит @geher, вы можете преобразовать его в bool с помощью astype, прежде чем обратное с ~
источник
.astype(bool)
~df['A'].astype(bool)
astype(bool)
происходит до~
~df['A'].astype(bool)
VS(~df['A']).astype(bool)
Я просто дать ему шанс:
источник
-
! Я буду помнить это в следующий раз.Вы также можете использовать
numpy.invert
:РЕДАКТИРОВАТЬ: Разница в производительности появляется в Ubuntu 12.04, Python 2.7, NumPy 1.7.0 - кажется, не существует при использовании NumPy 1.6.2, хотя:
источник
NumPy медленнее, потому что вводит входные данные в логические значения (поэтому None и 0 становятся False, а все остальное становится True).
дает тебе
тогда как ~ s потерпит крах. В большинстве случаев тильда будет более безопасным выбором, чем NumPy.
Панды 0,25, NumPy 1,17
источник