পান্ডাসে বুলিয়ান ইনডেক্সিংয়ের জন্য লজিকাল অপারেটর


152

আমি পান্ডসে বুলিয়ান সূচক নিয়ে কাজ করছি। প্রশ্নটি কেন বিবৃতি:

a[(a['some_column']==some_number) & (a['some_other_column']==some_other_number)]

ভাল কাজ করে

a[(a['some_column']==some_number) and (a['some_other_column']==some_other_number)]

ত্রুটি সহ প্রস্থান?

উদাহরণ:

a=pd.DataFrame({'x':[1,1],'y':[10,20]})

In: a[(a['x']==1)&(a['y']==10)]
Out:    x   y
     0  1  10

In: a[(a['x']==1) and (a['y']==10)]
Out: ValueError: The truth value of an array with more than one element is ambiguous.     Use a.any() or a.all()

6
এটি কারণ ন্যাপি অ্যারে এবং পান্ডাস সিরিজ যুক্তিসঙ্গত চেয়ে বিটওয়াইস অপারেটরগুলি ব্যবহার করে আপনি অ্যারে / সিরিজের প্রতিটি উপাদানকে অন্যের সাথে তুলনা করছেন। সুতরাং এই পরিস্থিতিতে লজিকাল অপারেটরটি ব্যবহার করা কোনও অর্থবোধ করে না। : দেখুন এর সাথে সম্পর্কিত stackoverflow.com/questions/8632033/...
EdChum

9
পাইথনে and != &andপাইথন মধ্যে অপারেটর উপেক্ষিত হতে পারে না, যেহেতু &অপারেটর ( __and__) করতে পারেন। অতএব পছন্দ &নিন্পি এবং পান্ডাস ব্যবহার করুন ।
স্টিভেন রাম্বালস্কি

উত্তর:


208

যখন তুমি বললে

(a['x']==1) and (a['y']==10)

আপনি স্পষ্টভাবে পাইথনকে রূপান্তর করতে (a['x']==1)এবং (a['y']==10)বুলিয়ান মানগুলিতে জিজ্ঞাসা করছেন ।

NumPy অ্যারে (1 এর চেয়ে বেশি দৈর্ঘ্যের) এবং সিরিজের মতো পান্ডাস অবজেক্টগুলির বুলিয়ান মান নেই - অন্য কথায়, তারা উত্থাপন করে

ValueError: The truth value of an array is ambiguous. Use a.empty, a.any() or a.all().

যখন বুলিয়ান মান হিসাবে ব্যবহৃত হয়। এটি কারণ এটি অস্পষ্ট যখন এটি সত্য বা মিথ্যা হওয়া উচিত । কিছু ব্যবহারকারী হয়ত পাইথন তালিকার মতো শূন্য-দৈর্ঘ্য না থাকলে তারা সত্য বলে ধরে নিতে পারেন। অন্যরা যদি এটির সমস্ত উপাদান সত্য হয় তবেই এটি সত্য হতে পারে desire অন্যরা চাইলে এটির সত্য হতে পারে যদি এর কোনও উপাদান সত্য হয়।

যেহেতু অনেকগুলি বিবাদী প্রত্যাশা রয়েছে, তাই নুমপি এবং পান্ডাদের ডিজাইনাররা অনুমান করতে অস্বীকার করেছেন এবং পরিবর্তে একটি ভ্যালুআরারের উত্থাপন করেছেন।

পরিবর্তে, আপনি অবশ্যই কোন আচরণটি চান তা নির্দেশ করার জন্য empty(), all()বা any()পদ্ধতিতে কল করে আপনাকে অবশ্যই স্পষ্ট হওয়া উচিত ।

এই ক্ষেত্রে, দেখে মনে হচ্ছে আপনি বুলিয়ান মূল্যায়ন চান না, আপনি উপাদান-ভিত্তিক যৌক্তিক-এবং চান। &বাইনারি অপারেটর এটিই সম্পাদন করে:

(a['x']==1) & (a['y']==10)

একটি বুলিয়ান অ্যারে প্রদান করে।


যাইহোক, অ্যালেক্সমিল নোট হিসাবে , বন্ধনীগুলি বাধ্যতামূলক, যেহেতু &অপেক্ষাকৃত উচ্চতর অপারেটর রয়েছে ==। প্রথম বন্ধনী ছাড়া, a['x']==1 & a['y']==10মূল্যায়ন করা হবে a['x'] == (1 & a['y']) == 10যা ঘুরে বেড়ানো তুলনার সমান হবে (a['x'] == (1 & a['y'])) and ((1 & a['y']) == 10)। এটাই রূপের প্রকাশ Series and Seriesandদুটি সিরিজের সাথে ব্যবহার আবার ValueErrorউপরের মত একই ট্রিগার হবে । এজন্য বন্ধনীগুলি বাধ্যতামূলক।


3
যদি লম্বা হয় তবে নাম্বার অ্যারেগুলির এই সম্পত্তি থাকে । কেবল পান্ডস দেবস (জেদী) অনুমান করতে অস্বীকার করেছেন: পি
অ্যান্ডি হেডেন

4
'&' একই ধরণের অস্পষ্ট বক্ররেখা 'এবং' বহন করে না? 'এবং' এর কথা এলে কীভাবে আসে, হঠাৎ সমস্ত ব্যবহারকারী সকলেই সম্মত হন যে এটি উপাদান-ভিত্তিক হওয়া উচিত, যখন তারা 'এবং' দেখেন, তখন তাদের প্রত্যাশা আলাদা হয়?
ইন্ডমিনাস

16
@Indominus: পাইথন ভাষা নিজেই প্রয়োজন যে অভিব্যক্তি x and yমূল্যায়ন আরম্ভ করে bool(x)এবং bool(y)। পাইথন "প্রথমে মূল্যায়ন করে x; যদি xএটি মিথ্যা হয় তবে এর মানটি ফিরে আসে; অন্যথায়, yমূল্যায়ন করা হয় এবং ফলস্বরূপ মানটি ফিরে আসে।" সুতরাং সিনট্যাক্সটি x and yএলিমেন্ট-ওয়াইজড লজিক্যাল-এবং কেবল xবা কেবল yফেরত দেওয়া যেতে পারে তার জন্য ব্যবহার করা যাবে না । বিপরীতে, x & yট্রিগার x.__and__(y)এবং __and__পদ্ধতিটি আমাদের পছন্দ মতো কিছু ফিরিয়ে দিতে সংজ্ঞায়িত করা যেতে পারে।
unutbu

2
লক্ষণীয় গুরুত্বপূর্ণ: ==ধারাটির চারপাশে প্রথম বন্ধনীগুলি বাধ্যতামূলকa['x']==1 & a['y']==10প্রশ্নের মতো একই ত্রুটি প্রদান করে।
অ্যালেক্স পি। মিলার

1
"|" কিসের জন্য?
অয়লার_সালটার

62

TLDR; পান্ডাসে লজিকাল অপারেটরগুলি &, |এবং ~, এবং প্রথম বন্ধনী (...)গুরুত্বপূর্ণ!

পাইথন এর and, orএবং notলজিক্যাল অপারেটর scalars সঙ্গে কাজ করার ডিজাইন করা হয়। সুতরাং পান্ডাদের এই কার্যকারিতাটির ভেক্টরাইজড (উপাদান-ভিত্তিক) সংস্করণ অর্জনের জন্য বিটওয়াইস অপারেটরদের আরও ভাল কিছু করতে হবে এবং বিটওয়াইস অপারেটরদের ওভাররাইড করতে হবে ।

সুতরাং পাইথনে নিম্নলিখিতগুলি ( exp1এবং exp2এমন একটি এক্সপ্রেশন যা একটি বুলিয়ান ফলাফলকে মূল্যায়ন করে) ...

exp1 and exp2              # Logical AND
exp1 or exp2               # Logical OR
not exp1                   # Logical NOT

... এ অনুবাদ করবে ...

exp1 & exp2                # Element-wise logical AND
exp1 | exp2                # Element-wise logical OR
~exp1                      # Element-wise logical NOT

পান্ডার জন্য

লজিকাল অপারেশন করার প্রক্রিয়াটিতে আপনি যদি একটি পান ValueError, তবে আপনাকে গোষ্ঠীকরণের জন্য বন্ধনী ব্যবহার করতে হবে:

(exp1) op (exp2)

উদাহরণ স্বরূপ,

(df['col1'] == x) & (df['col2'] == y) 

ইত্যাদি।


বুলিয়ান সূচক : ডেটা ফিল্টার করার জন্য যৌক্তিক শর্তের মাধ্যমে বুলিয়ান মাস্কগুলি গণনা করা একটি সাধারণ অপারেশন। পান্ডাস তিনটি অপারেটর সরবরাহ করে:&লজিকাল অ্যান্ডের|জন্য, লজিকাল ওআরের জন্য, এবং~লজিকাল নয়।

নিম্নলিখিত সেটআপ বিবেচনা করুন:

np.random.seed(0)
df = pd.DataFrame(np.random.choice(10, (5, 3)), columns=list('ABC'))
df

   A  B  C
0  5  0  3
1  3  7  9
2  3  5  2
3  4  7  6
4  8  8  1

লজিকাল এবং

জন্য dfউপরে, তুমি কোথায় একটি <5 ও বি> 5. এই কম্পিউটিং প্রতিটি অবস্থার জন্য মুখোশ আলাদাভাবে, এবং তাদের ANDing দ্বারা সম্পন্ন করা হয় সব সারি আসতে চাই বলে।

ওভারলোডেড বিটওয়াইস &অপারেটর
চালিয়ে যাওয়ার আগে দয়া করে দস্তাবেজের এই বিশেষ অংশটির নোটটি নিন, যা বিবরণে রয়েছে

আর একটি সাধারণ অপারেশন হ'ল ডেটা ফিল্টার করতে বুলিয়ান ভেক্টর ব্যবহার। অপারেটার আছেন: |জন্য or, &জন্য and, এবং ~জন্য notএই প্রথম বন্ধনী ব্যবহার করে দলবদ্ধ করা আবশ্যক , ডিফল্ট পাইথন দ্বারা যেহেতু যেমন একটি অভিব্যক্তি মূল্যায়ন করবে df.A > 2 & df.B < 3যেমন df.A > (2 & df.B) < 3, যখন কাঙ্ক্ষিত মূল্যায়ন অর্ডার (df.A > 2) & (df.B < 3)

সুতরাং, এটি মাথায় রেখে, উপাদান অনুসারে লজিক্যাল অ্যান্ড বিটওয়াইস অপারেটরের সাথে প্রয়োগ করা যেতে পারে &:

df['A'] < 5

0    False
1     True
2     True
3     True
4    False
Name: A, dtype: bool

df['B'] > 5

0    False
1     True
2    False
3     True
4     True
Name: B, dtype: bool

(df['A'] < 5) & (df['B'] > 5)

0    False
1     True
2    False
3     True
4    False
dtype: bool

এবং পরবর্তীকালে ফিল্টারিং পদক্ষেপটি সহজভাবে,

df[(df['A'] < 5) & (df['B'] > 5)]

   A  B  C
1  3  7  9
3  4  7  6

বন্ধনীগুলি বিটওয়াইস অপারেটরগুলির ডিফল্ট অগ্রাধিকার ক্রমকে ওভাররাইড করতে ব্যবহৃত হয়, যা শর্তাধীন অপারেটরগুলির চেয়ে বেশি অগ্রাধিকার <এবং >। অজগর ডক্সে অপারেটর অগ্রাধিকারের বিভাগটি দেখুন ।

আপনি যদি প্রথম বন্ধনী ব্যবহার না করেন তবে প্রকাশটি ভুলভাবে মূল্যায়ন করা হয়। উদাহরণস্বরূপ, যদি আপনি দুর্ঘটনাক্রমে এমন কিছু চেষ্টা করেন

df['A'] < 5 & df['B'] > 5

এটি হিসাবে পার্স করা হয়

df['A'] < (5 & df['B']) > 5

যা হয়ে যায়,

df['A'] < something_you_dont_want > 5

যা হয়ে যায় ( শৃঙ্খলিত অপারেটরের তুলনায় পাইথন ডক্স দেখুন ),

(df['A'] < something_you_dont_want) and (something_you_dont_want > 5)

যা হয়ে যায়,

# Both operands are Series...
something_else_you_dont_want1 and something_else_you_dont_want2

যা ছুড়ে দেয়

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

সুতরাং, যে ভুল করবেন না! 1

প্যারেন্টেহিস গোষ্ঠীকরণ এড়ানো এড়ানোটি
আসলে বেশ সহজ quite বেশিরভাগ অপারেটরের ডেটাফ্রেমগুলির সাথে সম্পর্কিত বাউন্ড পদ্ধতি রয়েছে। শর্তসাপেক্ষে অপারেটরগুলির পরিবর্তে পৃথক মুখোশগুলি যদি ফাংশনগুলি ব্যবহার করে তৈরি করা হয় তবে মূল্যায়নের ক্রম নির্দিষ্ট করার জন্য আপনাকে আর পেরেন দ্বারা দলবদ্ধ করার প্রয়োজন হবে না:

df['A'].lt(5)

0     True
1     True
2     True
3     True
4    False
Name: A, dtype: bool

df['B'].gt(5)

0    False
1     True
2    False
3     True
4     True
Name: B, dtype: bool

df['A'].lt(5) & df['B'].gt(5)

0    False
1     True
2    False
3     True
4    False
dtype: bool

নমনীয় তুলনা বিভাগটি দেখুন । সংক্ষেপে বলতে গেলে, আমাদের আছে

╒════╤════════════╤════════════╕
     Operator    Function   
╞════╪════════════╪════════════╡
  0  >           gt         
├────┼────────────┼────────────┤
  1  >=          ge         
├────┼────────────┼────────────┤
  2  <           lt         
├────┼────────────┼────────────┤
  3  <=          le         
├────┼────────────┼────────────┤
  4  ==          eq         
├────┼────────────┼────────────┤
  5  !=          ne         
╘════╧════════════╧════════════╛

প্রথম বন্ধনী এড়ানোর জন্য আরেকটি বিকল্প হ'ল ব্যবহার DataFrame.query(বা eval):

df.query('A < 5 and B > 5')

   A  B  C
1  3  7  9
3  4  7  6

আমি করেছি ব্যাপকভাবে নথিভুক্ত queryএবং evalমধ্যে pd.eval ব্যবহার ডায়নামিক এক্সপ্রেশন মূল্যায়ন পান্ডাস মধ্যে ()

operator.and_
আপনাকে কার্যক্ষম পদ্ধতিতে এই ক্রিয়াকলাপটি সম্পাদন করার অনুমতি দেয়। অভ্যন্তরীণ কলগুলি Series.__and__যা বিটওয়াইড অপারেটরের সাথে সম্পর্কিত।

import operator 

operator.and_(df['A'] < 5, df['B'] > 5)
# Same as,
# (df['A'] < 5).__and__(df['B'] > 5) 

0    False
1     True
2    False
3     True
4    False
dtype: bool

df[operator.and_(df['A'] < 5, df['B'] > 5)]

   A  B  C
1  3  7  9
3  4  7  6

আপনার সাধারণত এটির প্রয়োজন হবে না তবে এটি দরকারী।

সাধারণকরণ: np.logical_and(এবং logical_and.reduce)
আরেকটি বিকল্প ব্যবহার করা হচ্ছে np.logical_and, যার জন্য প্রথম বন্ধনী গোষ্ঠীকরণের প্রয়োজন নেই:

np.logical_and(df['A'] < 5, df['B'] > 5)

0    False
1     True
2    False
3     True
4    False
Name: A, dtype: bool

df[np.logical_and(df['A'] < 5, df['B'] > 5)]

   A  B  C
1  3  7  9
3  4  7  6

np.logical_andএটি ইউফুঙ্ক (ইউনিভার্সাল ফাংশন) এবং বেশিরভাগ ইউফঙ্কের একটি reduceপদ্ধতি থাকে। এর অর্থ logical_andআপনার যদি AND এ একাধিক মুখোশ থাকে তবে এটি সাধারণকরণ আরও সহজ । উদাহরণস্বরূপ, প্রয়োজন এবং মুখোশ m1এবং m2এবং m3সঙ্গে &, আপনি কি করতে হবে

m1 & m2 & m3

তবে, একটি সহজ বিকল্প হ'ল

np.logical_and.reduce([m1, m2, m3])

এটি শক্তিশালী, কারণ এটি আপনাকে আরও জটিল যুক্তি দিয়ে এই শীর্ষে তৈরি করতে দেয় (উদাহরণস্বরূপ, গতিশীলভাবে একটি তালিকা বোঝার জন্য মুখোশ তৈরি করা এবং এগুলি সব যুক্ত করে):

import operator

cols = ['A', 'B']
ops = [np.less, np.greater]
values = [5, 5]

m = np.logical_and.reduce([op(df[c], v) for op, c, v in zip(ops, cols, values)])
m 
# array([False,  True, False,  True, False])

df[m]
   A  B  C
1  3  7  9
3  4  7  6

1 - আমি জানি আমি এই পয়েন্টটি নিয়ে ক্ষতি করছি, তবে দয়া করে আমার সাথে সহ্য করুন। এটি একটি খুব , খুব সাধারণ শুরুর ভুল এবং এটি খুব ভালভাবে ব্যাখ্যা করতে হবে।


লজিকাল ও

জন্য dfউপরে, আপনি সমস্ত সারি যেখানে A == 3 বা বি == 7 আসতে চাই বলে।

ওভারলোডড বিটওয়াইজ |

df['A'] == 3

0    False
1     True
2     True
3    False
4    False
Name: A, dtype: bool

df['B'] == 7

0    False
1     True
2    False
3     True
4    False
Name: B, dtype: bool

(df['A'] == 3) | (df['B'] == 7)

0    False
1     True
2     True
3     True
4    False
dtype: bool

df[(df['A'] == 3) | (df['B'] == 7)]

   A  B  C
1  3  7  9
2  3  5  2
3  4  7  6

যদি আপনি এখনও না করেন তবে দয়া করে উপরের লজিকাল এবং উপরের অংশটি পড়ুন , সমস্ত ক্যাভেট এখানে প্রয়োগ করা হবে।

বিকল্পভাবে, এই অপারেশনটি নির্দিষ্ট করে দেওয়া যেতে পারে

df[df['A'].eq(3) | df['B'].eq(7)]

   A  B  C
1  3  7  9
2  3  5  2
3  4  7  6

operator.or_
Series.__or__ফণা নীচে কল ।

operator.or_(df['A'] == 3, df['B'] == 7)
# Same as,
# (df['A'] == 3).__or__(df['B'] == 7)

0    False
1     True
2     True
3     True
4    False
dtype: bool

df[operator.or_(df['A'] == 3, df['B'] == 7)]

   A  B  C
1  3  7  9
2  3  5  2
3  4  7  6

np.logical_or
দুটি শর্তের জন্য, ব্যবহার করুন logical_or:

np.logical_or(df['A'] == 3, df['B'] == 7)

0    False
1     True
2     True
3     True
4    False
Name: A, dtype: bool

df[np.logical_or(df['A'] == 3, df['B'] == 7)]

   A  B  C
1  3  7  9
2  3  5  2
3  4  7  6

একাধিক মাস্কের জন্য, ব্যবহার করুন logical_or.reduce:

np.logical_or.reduce([df['A'] == 3, df['B'] == 7])
# array([False,  True,  True,  True, False])

df[np.logical_or.reduce([df['A'] == 3, df['B'] == 7])]

   A  B  C
1  3  7  9
2  3  5  2
3  4  7  6

যৌক্তিক নয়

একটি মুখোশ দেওয়া, যেমন

mask = pd.Series([True, True, False])

আপনার যদি প্রতিটি বুলিয়ান মান উল্টাতে হয় (যাতে শেষ ফলাফল হয় [False, False, True]), তবে আপনি নীচের যে কোনও পদ্ধতি ব্যবহার করতে পারেন।

bitwise ~

~mask

0    False
1    False
2     True
dtype: bool

আবার, এক্সপ্রেশনগুলির প্রথম বন্ধন করা প্রয়োজন।

~(df['A'] == 3)

0     True
1    False
2    False
3     True
4     True
Name: A, dtype: bool

এটি অভ্যন্তরীণভাবে কল করে

mask.__invert__()

0    False
1    False
2     True
dtype: bool

তবে এটি সরাসরি ব্যবহার করবেন না।

operator.inv
অভ্যন্তরীণভাবে __invert__সিরিজ কল ।

operator.inv(mask)

0    False
1    False
2     True
dtype: bool

np.logical_not
এটি হ'ল নামী রূপ।

np.logical_not(mask)

0    False
1    False
2     True
dtype: bool

মনে রাখবেন, np.logical_andপ্রতিস্থাপিত করা যেতে পারে np.bitwise_and, logical_orসঙ্গে bitwise_or, এবং logical_notসঙ্গে invert


TLDR- এ @ সিএস 95, এলিমেন্ট-ভিত্তিক বুলিয়ান OR এর জন্য, আপনি পরিবর্তে এর |সমতুল্য , এমনটি ব্যবহার করার পক্ষে পরামর্শ দিচ্ছেন । আমি কি জিজ্ঞেস করতে পারি কেন? এই কাজের জন্য বিশেষভাবে ডিজাইন করা হয়নি ? প্রতিটি জোড় উপাদানগুলির জন্য এটি বিটওয়াইজ করার ভার কেন যুক্ত করবেন? numpy.bitwise_ornumpy.logical_ornumpy.logical_or
ফ্লো 2 কে

@ ফ্লো 2 কে আপনি কি প্রাসঙ্গিক পাঠ্যটি উদ্ধৃত করতে পারেন? আপনি যা উল্লেখ করছেন তা আমি খুঁজে পাচ্ছি না। FWIW আমি বজায় রেখেছি যে লজিক্যাল_ * অপারেটরগুলির সঠিক কার্যক্ষম সমতুল্য function
সিএস 95

@ cs95 আমি উত্তরের প্রথম লাইনটি উল্লেখ করছি: "টিএলডিআর; পান্ডাসে লজিকাল অপারেটররা &, | এবং।"।
ফ্লো 2 কে

@ flow2k এটা আক্ষরিক হয় ডকুমেন্টেশন : "আরেকটি সাধারণ অপারেশন বুলিয়ান ভেক্টর ব্যবহার ডেটা ফিল্টার হয় অপারেটার আছেন: |।। জন্য অথবা, & এবং, এবং ~ না জন্য"
সিএস 95

@ সিএস 95, ঠিক আছে, আমি কেবল এই বিভাগটি পড়েছি এবং এটি |উপাদান অনুসারে বুলিয়ান অপারেশনের জন্য ব্যবহার করে। তবে আমার কাছে, এই ডকুমেন্টেশনটি একটি "টিউটোরিয়াল" বেশি এবং এর বিপরীতে, আমি অনুভব করি যে এই এপিআই রেফারেন্সগুলি সত্যের উত্সের কাছাকাছি: numpy.bitwise_or এবং numpy.logical_or - তাই আমি যা বোঝার চেষ্টা করছি এখানে বর্ণিত।
ফ্লো 2 কে

4

পান্ডাসে বুলিয়ান ইনডেক্সিংয়ের জন্য লজিকাল অপারেটর

এটা যে Python- র কোনো ব্যবহার করতে পারবেন না গুরুত্বপূর্ণ লজিক্যাল অপারেটর ( and, orবা notদিকে) pandas.Seriesঅথবা pandas.DataFrameগুলি (একভাবে আপনি তাদের ব্যবহার করতে পারবেন না numpy.arrayএকাধিক উপাদান সঙ্গে গুলি)। আপনি কেন এটি ব্যবহার করতে পারবেন না তার কারণ হ'ল তারা boolতাদের অপারেশনগুলিকে স্পষ্টভাবে কল করে যা একটি ব্যতিক্রম ছুঁড়ে দেয় কারণ এই ডেটা স্ট্রাকচারগুলি সিদ্ধান্ত নিয়েছিল যে অ্যারের বুলিয়ান অস্পষ্ট:

>>> import numpy as np
>>> import pandas as pd
>>> arr = np.array([1,2,3])
>>> s = pd.Series([1,2,3])
>>> df = pd.DataFrame([1,2,3])
>>> bool(arr)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
>>> bool(s)
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
>>> bool(df)
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

"একটি সিরিজের সত্য মানটি অস্পষ্ট is এর উত্তরটিতে আমি এটি আরও ব্যাপকভাবে কভার করেছি a + এ

NumPys যৌক্তিক ফাংশন

তবে NumPy ফাংশন এই অপারেটার যে ব্যবহার করা যেতে পারে উপাদান ভিত্তিক অপারেটিং সমতুল প্রদান করে numpy.array, pandas.Series, pandas.DataFrame, বা অন্য কোন (অনুসারী) numpy.arrayউপশ্রেণী:

সুতরাং, মূলত, একটিকে ব্যবহার করা উচিত (ধরে নেওয়া df1এবং df2এটি পান্ডাস ডেটা ফ্রেমগুলি):

np.logical_and(df1, df2)
np.logical_or(df1, df2)
np.logical_not(df1)
np.logical_xor(df1, df2)

বুলিয়ান্সের জন্য বিটওয়াইস ফাংশন এবং বিটওয়াইস অপারেটর

তবে আপনার যদি বুলিয়ান নম্পপি অ্যারে, পান্ডাস সিরিজ, বা পান্ডাস ডেটা ফ্রেম থাকে তবে আপনি উপাদান-ভিত্তিক বিটওয়াইস ফাংশনও ব্যবহার করতে পারেন (সেগুলি বুলিয়ানদের জন্য - বা কমপক্ষে হওয়া উচিত - লজিক্যাল ফাংশন থেকে পৃথক পৃথক):

  • বিটওয়াইজ এবং: np.bitwise_andবা &অপারেটর
  • বিটওয়াইস বা: np.bitwise_orবা |অপারেটর
  • বিটওয়াইস না: np.invert(বা উপনাম np.bitwise_not) বা ~অপারেটর
  • বিটওয়াইজ এক্সওর: np.bitwise_xorবা ^অপারেটর

সাধারণত অপারেটর ব্যবহার করা হয়। তবে তুলনামূলক অপারেটরগুলির সাথে একত্রিত হওয়ার সময় কাউকে কাউকে প্রথম বন্ধনে তুলনা করতে হবে কারণ তুলনা অপারেটরগুলির তুলনায় বিটওয়াইস অপারেটরগুলির উচ্চতর প্রাধান্য রয়েছে :

(df1 < 10) | (df2 > 10)  # instead of the wrong df1 < 10 | df2 > 10

এই জ্বালাময় হতে পারে কারণ পাইথন লজিক্যাল অপারেটর তুলনা অপারেটরদের চেয়ে কম একটি precendence তাই আপনি সাধারণত লেখার a < 10 and b > 10(যেখানে aএবং bউদাহরণস্বরূপ সহজ ইন্টিজার জন্য) এবং প্রথম বন্ধনী প্রয়োজন হবে না।

লজিকাল এবং বিটওয়াইজ অপারেশনগুলির মধ্যে পার্থক্য (নন-বুলিয়ানদের উপর)

এটি জোর দেওয়া সত্যিই গুরুত্বপূর্ণ যে বিট এবং লজিকাল অপারেশনগুলি কেবল বুলিয়ান নুমপি অ্যারে (এবং বুলিয়ান সিরিজ এবং ডেটা ফ্রেম) এর সমতুল্য। যদি এগুলিতে বুলেট থাকে না তবে ক্রিয়াকলাপগুলি বিভিন্ন ফলাফল দেয়। আমি নুমপি অ্যারে ব্যবহার করে উদাহরণগুলি অন্তর্ভুক্ত করব তবে পান্ডাস ডেটা স্ট্রাকচারের জন্য ফলাফলগুলি সমান হবে:

>>> import numpy as np
>>> a1 = np.array([0, 0, 1, 1])
>>> a2 = np.array([0, 1, 0, 1])

>>> np.logical_and(a1, a2)
array([False, False, False,  True])
>>> np.bitwise_and(a1, a2)
array([0, 0, 0, 1], dtype=int32)

এবং যেহেতু নুমপি (এবং একইভাবে পান্ডাস) বুলিয়ান ( বুলিয়ান বা "মাস্ক" সূচক অ্যারে ) এবং পূর্ণসংখ্যার ( সূচক অ্যারে ) সূচকগুলির জন্য সূচকগুলিও পৃথক হতে পারে:

>>> a3 = np.array([1, 2, 3, 4])

>>> a3[np.logical_and(a1, a2)]
array([4])
>>> a3[np.bitwise_and(a1, a2)]
array([1, 1, 1, 2])

সারমর্ম সারনি

Logical operator | NumPy logical function | NumPy bitwise function | Bitwise operator
-------------------------------------------------------------------------------------
       and       |  np.logical_and        | np.bitwise_and         |        &
-------------------------------------------------------------------------------------
       or        |  np.logical_or         | np.bitwise_or          |        |
-------------------------------------------------------------------------------------
                 |  np.logical_xor        | np.bitwise_xor         |        ^
-------------------------------------------------------------------------------------
       not       |  np.logical_not        | np.invert              |        ~

যেখানে লজিকাল অপারেটর নম্পপি অ্যারে , পান্ডাস সিরিজ এবং প্যান্ডাস ডেটা ফ্রেমের জন্য কাজ করে না । অন্যরা এই ডেটা স্ট্রাকচারগুলিতে (এবং প্লেইন পাইথন অবজেক্ট) এবং উপাদান অনুসারে কাজ করে। তবে সরল পাইথন- boolএর বিটওয়াইস উল্টানো নিয়ে সাবধান থাকুন কারণ এই প্রসঙ্গে বুলকে পূর্ণসংখ্যা হিসাবে ব্যাখ্যা করা হবে (উদাহরণস্বরূপ ~Falseপ্রত্যাবর্তন -1এবং ~Trueপ্রত্যাবর্তন -2)।

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