পরিচয়
পান্ডাস একটি অনুপস্থিত মান উপস্থাপন করতে NumPy NaN (np.nan) অবজেক্ট ব্যবহার করে। এই Numpy NaN মানের কিছু আকর্ষণীয় গাণিতিক বৈশিষ্ট্য রয়েছে। উদাহরণস্বরূপ, এটি নিজের সমান নয়। যাইহোক, পাইথন কোন বস্তুই নিজের সাথে তুলনা করলে সত্য বলে মূল্যায়ন করে না।
কিভাবে করতে হবে..
np.nan কীভাবে আচরণ করে তা বোঝার জন্য আসুন কিছু উদাহরণ দেখি।
import pandas as pd import numpy as np # Python None Object compared against self. print(f"Output \n *** {None == None} ")
আউটপুট
*** True
# Numpy nan compared against self. print(f"Output \n *** {np.nan == np.nan} ")
আউটপুট
*** False
# Is nan > 10 or 1000 ? print(f"Output \n *** {np.nan > 10} ")
আউটপুট
*** False
ঐতিহ্যগতভাবে, সিরিজ এবং ডেটাফ্রেম তুলনা করার জন্য সমান অপারেটর, ==, ব্যবহার করে। তুলনার ফলাফল একটি বস্তু। আসুন প্রথমে দেখি কিভাবে সমান অপারেটর ব্যবহার করতে হয়।
# create a dataframe with tennis players and their grandslam titles. df = pd.DataFrame(data={"players": ['Federer', 'Nadal', 'Djokovic', 'Murray','Medvedev','Zverev'], "titles": [20, 19, 17, 3,np.nan,np.nan]}) # set the index df.index = df['players'] # sort the index in ascending df.sort_index(inplace=True, ascending=True) # check if the index is set df.index.is_monotonic_increasing # see records print(f"Output \n{df}")
আউটপুট
players titles players Djokovic Djokovic 17.0 Federer Federer 20.0 Medvedev Medvedev NaN Murray Murray 3.0 Nadal Nadal 19.0 Zverev Zverev NaN
1. আরও ভালভাবে বোঝার জন্য, আমরা প্রথমে সমস্ত খেলোয়াড়কে একটি স্কেলার মান "ফেদেরার" এর সাথে তুলনা করব এবং ফলাফলগুলি দেখব৷
print(f'Output \n {df == "Federer"}')
আউটপুট
players titles players Djokovic False False Federer True False Medvedev False False Murray False False Nadal False False Zverev False False
C:\Users\sasan\anaconda3\lib\site-packages\pandas\core\ops\array_ops.py:253: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison res_values = method(rvalues)
2. এটি প্রত্যাশিত হিসাবে কাজ করে কিন্তু যখনই আপনি অনুপস্থিত মানগুলির সাথে ডেটাফ্রেমের তুলনা করার চেষ্টা করেন তখন সমস্যা হয়৷ এটি পর্যবেক্ষক করার জন্য আসুন df-কে নিজের সাথে তুলনা করি।
df_compare = df == df print(f'Output \n {df_compare}')
আউটপুট
players titles players Djokovic True True Federer True True Medvedev True False Murray True True Nadal True True Zverev True False
3. প্রথম নজরে, সমস্ত মান সঠিক বলে মনে হতে পারে, যেমনটা আপনি আশা করেন। যাইহোক, প্রতিটি কলামে শুধুমাত্র সত্য মান রয়েছে কিনা তা দেখতে .all পদ্ধতি ব্যবহার করুন (যেমনটি আমরা দুটি অনুরূপ বস্তুর তুলনা করছি ঠিক তাই?) একটি অপ্রত্যাশিত ফলাফল দেয়৷
print(f'Output \n {df_compare.all()}')
আউটপুট
players True titles False dtype: bool
4.আগের নোটে উল্লিখিত হিসাবে, এটি ঘটে কারণ অনুপস্থিত মানগুলি একে অপরের সাথে সমানভাবে তুলনা করে না। দেখুন, আমরা স্পষ্টভাবে জানি যে মেদভেদেভ এবং জাভেরেভের কোনো শিরোনাম নেই (অর্থাৎ NaN) তাই প্রতিটি কলামে অনুপস্থিত মানের সংখ্যা যোগ করলে আমাদের শিরোনামের জন্য 2 এবং খেলোয়াড়দের জন্য 0 মান পাওয়া উচিত। আসুন দেখি কি হয়।
print(f'Output \n {(df_compare == np.nan).sum()}')
আউটপুট
players 0 titles 0 dtype: int64
5. উপরের ফলাফলটি অপ্রত্যাশিত কারণ ন্যান খুব ভিন্নভাবে আচরণ করে।
6. দুটি সম্পূর্ণ ডেটাফ্রেমকে একে অপরের সাথে তুলনা করার সঠিক উপায় হল সমান অপারেটর (==) নয় বরং .equals পদ্ধতির সাথে।
এই পদ্ধতিটি একই অবস্থানে থাকা NaNগুলিকে সমান হিসাবে বিবেচনা করে৷
একটি গুরুত্বপূর্ণ নোট হল .eq পদ্ধতি হল ==নয় .equals এর সমতুল্য।
print(f'Output \n {df_compare.equals(df_compare)}')
আউটপুট
True
7. আপনি যদি আপনার ইউনিট পরীক্ষার অংশ হিসাবে দুটি ডেটাফ্রেম তুলনা করার চেষ্টা করেন তবে করার আরেকটি উপায় রয়েছে। assert_frame_equal ফাংশন একটি AssertionError উত্থাপন করে যদি দুটি ডেটাফ্রেম সমান না হয়। দুটি ডেটাফ্রেম সমান হলে এটি কোনটিই প্রদান করে না৷
from pandas.testing import assert_frame_equal print(f'Output \n {assert_frame_equal(df_compare, df_compare) is None}')
আউটপুট
True