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
।