আমি কীভাবে কোনও পান্ডাস সিরিজের উপাদান-ভিত্তিক লজিক্যাল নয়?


229

আমার কাছে একটি পান্ডাস Seriesঅবজেক্ট রয়েছে যার মধ্যে বুলিয়ান মান রয়েছে। আমি NOTপ্রতিটি মানের যৌক্তিক সমন্বিত একটি সিরিজ কীভাবে পেতে পারি ?

উদাহরণস্বরূপ, অন্তর্ভুক্ত একটি সিরিজ বিবেচনা করুন:

True
True
True
False

আমি যে সিরিজটি পেতে চাই তাতে অন্তর্ভুক্ত থাকবে:

False
False
False
True

এটি যথাযথভাবে সহজ হওয়া উচিত বলে মনে হয় তবে স্পষ্টতই আমি আমার মোজো = ভুল করে রেখেছি =


1
এটি গুরুত্বপূর্ণ যে ডেটাতে objectকাজ করার জন্য নীচের উত্তরগুলির জন্য ধরণ নেই, তাই ব্যবহার করুন:~ df.astype('bool')
শিখিফিলি

আমি এই পোস্টে সমস্ত লজিকাল অপারেটর সম্পর্কে লিখেছি । পোস্ট এছাড়াও বিকল্প অন্তর্ভুক্ত।
CS95

উত্তর:


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

পাইথন 2.7, নম্পপি 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

পান্ডাস 0.13.0 হিসাবে, সিরিজ আর আর সাবক্লাস নয় numpy.ndarray; তারা এখন সাবক্লাস হয় pd.NDFrame। এই কেন কি কিছু থাকতে পারে np.invert(s)আর যত দ্রুত ~sবা -s

ক্যাভেট: timeitহার্ডওয়্যার, সংকলক, ওএস, পাইথন, নুমপি এবং পান্ডাস সংস্করণ সহ অনেকগুলি বিষয়ের উপর নির্ভর করে ফলাফলগুলি পৃথক হতে পারে।


যথাযথভাবে উল্লেখ. অনেক ধীর হওয়া ছাড়া টিলড এবং এর মধ্যে পার্থক্য কী -?
blz

ওয়েয়ার্ড, tildeডকুমেন্টেশনে যেমনটি উল্লেখ করা হয়েছিল আমি তেমনই পরীক্ষিত হয়েছিলাম তবে এটি একইভাবে সম্পাদন করে নি np.invert: এস
রুট

@blz: আমার উবুন্টু মেশিনে অন্তত NumPy 1.6.2, কর্মক্ষমতা চলমান এ np.invert(s), ~sএবং -sসবাই একই রকম।
আনতুবু

@ রুট: আমার সময়সীমার ফলাফলের মধ্যে কেন এত বড় তাত্পর্য রয়েছে তা আমি নিশ্চিত নই, তবে অবশ্যই তা ঘটতে পারে। আপনি NumPy এর কোন ওএস এবং সংস্করণ ব্যবহার করছেন?
আনতুবু

উবুন্টুতেও, তবে NumPy 1.7.0 ব্যবহার করে ... ( np.bitwise_not(s)এর মতোই সম্পাদন করে np.inverse)।
রুটটি

32

@ আনটবুর উত্তর স্পট রয়েছে, কেবল একটি সতর্কতা যুক্ত করতে চেয়েছিলেন যে আপনার মাস্কটি 'অবজেক্ট' নয়, ডাইপাইপুল হওয়া উচিত। অর্থাৎ আপনার মুখোশটি কখনও কোনও ন্যান থাকতে পারে না । এখানে দেখুন - আপনার মুখোশটি এখন ন্যান-মুক্ত হলেও এটি 'অবজেক্ট' টাইপ থেকে যাবে।

একটি 'অবজেক্ট' সিরিজের বিপরীতটি কোনও ত্রুটি ছুঁড়ে ফেলবে না, পরিবর্তে আপনি এমন কালিযুক্ত আবর্জনার মুখোশ পাবেন যা আপনার প্রত্যাশা অনুযায়ী কাজ করবে না।

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

যেমন @ জিহর বলেছেন, আপনি ~ এর সাথে বিপরীত হওয়ার আগে আপনি এটিকে টাইপ দিয়ে বুলে রূপান্তর করতে পারেন ~

~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)
ইনটস মাস্কটি আপনার পছন্দ মতো বুল

এটি কাজ করছে কারণ বনামastype(bool)~ ~df['A'].astype(bool)(~df['A']).astype(bool)
JSharm

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

আমি আক্ষরিক ছাড়াও প্রতিটি অপারেটর চেষ্টা করেছিলাম -! আমি এটি পরের বারের জন্য মনে রাখব।
blz

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- এ প্রদর্শিত হবে - যদিও 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

এটি অন্য কোনও প্ল্যাটফর্মে সঠিক নাও হতে পারে। উইন,, পাইথন ৩. num.৩ নাম্বার ১.১৩.৩, পান্ডাস ০.২০.৩, (-এস) সবচেয়ে দ্রুত হবে, (~ গুলি) দ্বিতীয়, এবং এনপিআইভার্ট (গুলি) সবচেয়ে ধীর
গাইজিডফ

0

নুমপি ধীর গতির কারণ এটি বুলিয়ান মানগুলিতে ইনপুট ফেলেছে (তাই কোনওটিই নয় এবং 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

তবে cra গুলি ক্রাশ হবে। বেশিরভাগ ক্ষেত্রে টিলডে NumPy এর চেয়ে নিরাপদ পছন্দ হবে।

পান্ডাস 0.25, নম্পপি 1.17

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.