मैं पंडों की श्रृंखला का तत्व-वार तार्किक नहीं कैसे प्राप्त कर सकता हूं?


229

मेरे पास पैंडस Seriesऑब्जेक्ट है जिसमें बूलियन वैल्यूज हैं। मैं NOTप्रत्येक मूल्य के तार्किक युक्त श्रृंखला कैसे प्राप्त कर सकता हूं ?

उदाहरण के लिए, एक श्रृंखला युक्त पर विचार करें:

True
True
True
False

मैं जिस श्रृंखला को प्राप्त करना चाहूंगा उसमें शामिल हैं:

False
False
False
True

ऐसा लगता है कि यह यथोचित सरल होना चाहिए, लेकिन जाहिर है मैंने अपने मोजो को गलत समझा है = (


1
यह महत्वपूर्ण है कि डेटा में objectकाम करने के लिए नीचे दिए गए उत्तरों के प्रकार नहीं हैं , इसलिए उपयोग करें:~ df.astype('bool')
LearnOPhile

मैंने इस पोस्ट में सभी तार्किक ऑपरेटरों के बारे में लिखा है । पोस्ट में विकल्प भी शामिल हैं।
सीएस 95

जवाबों:


259

एक बूलियन श्रृंखला पलटना, का उपयोग करें~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, Pandas 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

पंडों के रूप में 0.13.0, श्रृंखला अब उपवर्ग नहीं हैं numpy.ndarray; वे अब उपवर्ग हैं pd.NDFrame। यह कुछ के साथ क्या करना है क्यों np.invert(s)नहीं रह गया है ~sया के रूप में उपवास के रूप में हो सकता है -s

कैविएट: timeitहार्डवेयर, कंपाइलर, ओएस, पायथन, न्यूमपी और पंडस संस्करणों सहित कई कारकों के आधार पर परिणाम भिन्न हो सकते हैं।


विधिवत् नोट किया हुआ। बहुत धीमी होने के अलावा, टिल्ड और के बीच क्या अंतर है -?
ब्लेज़

Wierd, मैंने वास्तव में परीक्षण के tildeरूप में उल्लेख किया था, लेकिन यह उसी तरह से प्रदर्शन नहीं किया था np.invert: एस
रूट

@blz: कम से कम मेरे उबंटू मशीन पर, NumPy 1.6.2, का प्रदर्शन चल रहा है np.invert(s), ~sऔर -sसभी समान हैं।
अप्रयुक्त

@ बरोट: मुझे यकीन नहीं है कि हमारे समय के परिणामों में इतनी बड़ी विसंगति क्यों है, लेकिन यह निश्चित रूप से हो सकता है। NumPy का OS और संस्करण क्या उपयोग कर रहे हैं?
अप्रयुक्त

उबंटू पर भी, लेकिन NumPy 1.7.0 का उपयोग करके ... ( np.bitwise_not(s)जैसा करता है np.inverse)।
रूट

32

@ अनटुब का जवाब हाजिर है, बस एक चेतावनी जोड़ना चाहता था कि आपके मास्क को dtype bool होना चाहिए, न कि 'ऑब्जेक्ट'। यानी आपके मास्क में कभी भी कोई नान नहीं हो सकता है । यहां देखें - भले ही आपका मुखौटा अब नैनो-मुक्त है, यह 'ऑब्जेक्ट' प्रकार रहेगा।

'ऑब्जेक्ट' सीरीज़ का विलोम एक एरर नहीं फेंकेगा, इसके बजाय आपको इनट्स का कचरा मास्क मिलेगा जो आपकी अपेक्षा के अनुरूप काम नहीं करेगा।

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

सहकर्मियों से इस बारे में बात करने के बाद, मेरे पास एक स्पष्टीकरण है: ऐसा लगता है कि पंडों ने बिटवाइज़ ऑपरेटर को वापस भेजा है:

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

जैसा कि @geher कहता है, आप ~ के साथ उलटा करने से पहले इसे बूल में परिवर्तित कर सकते हैं

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

आपके उदाहरण में, आउटपुट इनट्स मास्क को बूल श्रृंखला में बदला जा सकता है, .astype(bool)जैसे कि आप~df['A'].astype(bool)
geher

यह इसलिए काम कर रहा है क्योंकि astype(bool)~ ~df['A'].astype(bool)(~df['A']).astype(bool)
जेशरम

16

मैं इसे सिर्फ एक शॉट देता हूं:

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

मैं सचमुच के अलावा हर ऑपरेटर की कोशिश की -! मैं अगली बार इसे ध्यान में रखूंगा।
११ ’११

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

संपादित करें: प्रदर्शन में अंतर उबंटू 12.04, पायथन 2.7, न्यूमॉपी 1.7.0 पर दिखाई देता है - हालांकि यह संभव नहीं है कि न्यूमपी 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

यह एक अलग मंच पर सही नहीं हो सकता है। विन 7, अजगर 3.6.3 अंक 1.13.3, पांडा 0.20.3, (-s) सबसे तेज होगा, (~ s) दूसरा है, और np.invert (s) सबसे धीमा है
gaozhnf

0

NumPy धीमा है क्योंकि यह बूलियन मानों के लिए इनपुट देता है (इसलिए कोई नहीं और 0 गलत हो जाता है और बाकी सब सच हो जाता है)।

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, न्यूमप को 1.17

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.