নাএন এবং কারও মধ্যে পার্থক্য কী?


97

আমি প্যান্ডাস ব্যবহার করে একটি সিএসভি ফাইলের দুটি কলাম পড়ছি readcsv()এবং তারপরে একটি অভিধানে মানগুলি নির্ধারণ করছি। কলামগুলিতে সংখ্যা এবং বর্ণের স্ট্রিং রয়েছে। মাঝেমধ্যে এমন কোনও ঘটনা ঘটে থাকে যেখানে কোনও সেল খালি থাকে। আমার মতে, অভিধানের প্রবেশের পাঠ্য মানটি হওয়া উচিত Noneতবে পরিবর্তে nanবরাদ্দ করা হয়েছে। Noneএটি একটি নাল মান হিসাবে অবশ্যই একটি খালি কক্ষের আরও বর্ণনামূলক, যেখানে nanকেবল বলেছেন যে পঠিত মানটি একটি সংখ্যা নয়।

আমার সঠিক বোঝার, মধ্যে পার্থক্য কি Noneএবং nan? nanপরিবর্তে বরাদ্দ করা হয় কেন None?

এছাড়াও, কোনও শূন্য কোষের জন্য আমার অভিধানের চেকটি ব্যবহার করা হচ্ছে numpy.isnan():

for k, v in my_dict.iteritems():
    if np.isnan(v):

তবে এটি আমাকে ত্রুটি দেয় যাতে আমি এই চেকটি ব্যবহার করতে পারি না v। আমার ধারণা এটি এর কারণ এটি একটি পূর্ণসংখ্যা বা ভাসমান ভেরিয়েবল, কোনও স্ট্রিং ব্যবহার করা নয়। যদি এটি সত্য হয় তবে আমি কীভাবে vএকটি "খালি সেল" / nanকেস পরীক্ষা করতে পারি ?


পাঠ্যটি qwertyকোনও সংখ্যা নয়।
রবার্ট হার্ভে

4
@ রবার্ট হার্ভি আমি জানি, সুতরাং অবশ্যই Noneএকটি খালি ঘরের মূল্য সম্পর্কে আরও ভাল বিবরণ হবে।
ব্যবহারকারীর 1083734

উত্তর:


110

প্যানডে ধারাবাহিকভাবে ডেটা মিস করার জন্য এনএএন স্থানধারক হিসাবে ব্যবহৃত হয় , ধারাবাহিকতা ভাল। আমি সাধারণত NAN "অনুপস্থিত" হিসাবে পড়ি / অনুবাদ করি । আরো দেখুন ডেটা অনুপস্থিত সঙ্গে কাজ ' ডক্সে অধ্যায়।

ওয়েস ডক্সে 'এনএ-প্রতিনিধিত্বের পছন্দ' লিখেছেন :

বছরের বেশিরভাগ উত্পাদন ব্যবহারের পরে [এনএএন] কমপক্ষে আমার মতে, নম্পপি এবং পাইথনের সাধারণ পরিস্থিতি বিবেচনায় রেখে সেরা সিদ্ধান্ত হিসাবে প্রমাণিত হয়েছে। বিশেষ মান NaN (না-এ-সংখ্যা) সর্বত্র এনএ মান হিসাবে ব্যবহৃত হয়, এবং সেখানে এপিআই ফাংশন রয়েছে isnullএবং notnullযা এনএ মানগুলি সনাক্ত করতে dtyype জুড়ে ব্যবহার করা যেতে পারে।
...
সুতরাং, আমি পাইথোনিক "প্র্যাকটিলিটি বিটস পিউরিটি" পদ্ধতির পছন্দ করেছি এবং এনএ বোঝাতে ফ্লোট এবং অবজেক্ট অ্যারেগুলিতে একটি বিশেষ মান ব্যবহার করার জন্য সহজ সরল পদ্ধতির জন্য এবং পূর্ণসংখ্যার অ্যারেগুলিকে এমএএন হতে হবে যখন প্রচার করতে পারি প্রবর্তিত

দ্রষ্টব্য: "গোটচা" যা অনুপস্থিত ডেটাযুক্ত পূর্ণসংখ্যা সিরিজগুলি ভাসমানগুলিতে আপকেটেড হয়

আমার মতে মধ্যে nan (একটিও বেশি) ব্যবহার করতে প্রধান কারণ এটি numpy এর float64 dtype সঙ্গে সংরক্ষণ করা যেতে পারে, বরং কম দক্ষ বস্তুর dtype চেয়ে হয় দেখতে এন প্রচার টাইপ

#  without forcing dtype it changes None to NaN!
s_bad = pd.Series([1, None], dtype=object)
s_good = pd.Series([1, np.nan])

In [13]: s_bad.dtype
Out[13]: dtype('O')

In [14]: s_good.dtype
Out[14]: dtype('float64')

জেফ এই সম্পর্কে মন্তব্য (নীচে):

np.nanভেক্টরাইজড অপারেশনগুলির জন্য অনুমতি দেয়; এটি একটি ভাসমান মান, যখন Noneসংজ্ঞা অনুসারে বস্তুর প্রকারকে জোর করে, যা মূলত আঙ্কে সমস্ত দক্ষতা অক্ষম করে।

সুতরাং 3 বার দ্রুত পুনরাবৃত্তি করুন: অবজেক্ট == খারাপ, ভাসা == ভাল

এই বলে যে, অনেকগুলি ক্রিয়াকলাপ এখনও নোনা বনাম NaN এর সাথে ঠিক একইভাবে কাজ করতে পারে (তবে সম্ভবত এটি সমর্থিত নয় যেমন তারা কখনও কখনও আশ্চর্যজনক ফলাফলও দিতে পারে ):

In [15]: s_bad.sum()
Out[15]: 1

In [16]: s_good.sum()
Out[16]: 1.0

দ্বিতীয় প্রশ্নের উত্তর দেওয়ার জন্য:
আপনার ব্যবহার করা উচিত pd.isnullএবং pd.notnullনিখোঁজ ডেটা (এনএএন) পরীক্ষা করা উচিত ।


19
এখানে কেবল 2 সি যোগ করা .... np.nanভেক্টরাইজড ক্রিয়াকলাপের অনুমতি দেয়; এটি একটি ভাসমান মান, যখন Noneসংজ্ঞায়িত বাহিনীগুলি objectটাইপ করে এবং মূলত সমস্ত কর্ম দক্ষতায় নাম্পায় অক্ষম করে, তাই 3 বার দ্রুত পুনরাবৃত্তি করুন:object==bad, float==good
জেফ

4
কি <NA>এছাড়াও একটি np.nan?
গাথাইড

18

NaNগাণিতিক ক্রিয়াকলাপগুলিতে একটি সাংখ্যিক মান হিসাবে ব্যবহার করা যেতে পারে, যখন Noneনা (বা কমপক্ষে হওয়া উচিত নয়)।

NaNআইইইইই 754 ফ্লোটিং-পয়েন্ট স্ট্যান্ডার্ডে সংজ্ঞায়িত হিসাবে এটি একটি সাংখ্যিক মানNoneএকটি অভ্যন্তরীণ পাইথন টাইপ ( NoneType) এবং এটি এই প্রসঙ্গে "সংখ্যাসূচকভাবে অবৈধ" এর চেয়ে "অনাবিল" বা "খালি" এর মতো হবে।

এর মূল "লক্ষণ" হ'ল এটি হল যে আপনি যদি এনএন থাকে এমন একটি অ্যারেতে গড় বা যোগফল, এমনকি একটি একক করে থাকেন, ফলস্বরূপ আপনি এনএএন পাবেন ...

অন্যদিকে, আপনি Noneঅপরেন্ড হিসাবে ব্যবহার করে গাণিতিক ক্রিয়াকলাপ সম্পাদন করতে পারবেন না ।

সুতরাং, কেসের উপর নির্ভর করে, আপনি Noneআপনার অ্যালগরিদমকে গণনার ক্ষেত্রে অবৈধ বা অস্তিত্বমূলক মানগুলি বিবেচনা না করার জন্য উপায় হিসাবে ব্যবহার করতে পারেন । এর অর্থ হ'ল অ্যালগরিদমের প্রতিটি মান পরীক্ষা করা উচিত কিনা তা দেখার জন্য None

আপনার ফলাফলগুলি দূষিত করতে এনএন মানগুলি এড়াতে নিম্পির কিছু ফাংশন রয়েছে, যেমন nansumএবং nan_to_numউদাহরণস্বরূপ।


আমি আপনার সাথে একমত যে কোনওটিই অস্তিত্বহীন এন্ট্রিগুলির জন্য ব্যবহার করা উচিত নয়, তবে কেন খালি ঘরগুলির জন্য df=pd.readcsv('file.csv')আমাকে NaNমান দেয় এবং না Noneকেন? যতদূর আমি সচেতন, পিডি.ডাটা ফ্রেমগুলি সংখ্যার জন্য একচেটিয়া নয়।
ব্যবহারকারীর 1083734

ঠিক আছে, এটি সম্ভবত একটি নকশা পছন্দ। আমি মনে করি ডেটা ফ্রেম এবং সিরিজের একটি রয়েছে dtype, সুতরাং এর অবৈধ মানগুলি dtype=floatঅবশ্যই সংখ্যাসূচক মানের দ্বারা প্রতিনিধিত্ব করতে হবে, যা NaNহয় এবং Noneহয় না (এর Noneহয় NoneType)।
হেলটনবাইকার

এছাড়াও, প্রচুর পান্ডাস পদ্ধতির একটি naযুক্তি রয়েছে, যা আপনাকে সিদ্ধান্ত নিতে দেয় যে উপলভ্য নয় এমন মানগুলি প্রতিস্থাপন করতে আপনি কোন মানটি ব্যবহার করতে যাচ্ছেন
হেলটনবাইকার

ঠিক আছে ধন্যবাদ. সুতরাং আমি আসলে আমার ডেটাফ্রেমে সংখ্যাগুলি পড়ছি না, তবে সংখ্যা এবং অক্ষরের স্ট্রিং। খালি ঘরগুলি সনাক্ত করতে আমার কী ধরণের চেক ব্যবহার করা উচিত? একটি চেক মত; যদি dtype == ভাসা: ??
ব্যবহারকারীর 1083734

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

3

ফাংশনটি isnan()পরীক্ষা করে কিছু পরীক্ষা করে দেখায় যে কিছু "নম্বর নয়" এবং ভেরিয়েবল একটি সংখ্যা কিনা তা প্রত্যাবর্তন করবে, উদাহরণস্বরূপ isnan(2)মিথ্যা প্রত্যাবর্তন হবে

myVar is not Noneভেরিয়েবল সংজ্ঞায়িত করা হয়েছে কিনা শর্তসাপেক্ষ ফেরত দেয়

আপনার অলপ অ্যারে ব্যবহার করে isnan()কারণ এটি সংখ্যার অ্যারে হিসাবে অভিপ্রায়যুক্ত এবং এটি অ্যারের সমস্ত উপাদানকে NaNএই উপাদানগুলির সাথে আরম্ভ করে "খালি" হিসাবে বিবেচিত হয়


4
আমি ভাবি isnan(2)যে ফিরে আসবে False, যেহেতু 2 কোনও এনএএন নয়।
হেলটনবাইকার

এছাড়াও, numpy.emptyঅ্যারে মানগুলি আরম্ভ করে না NaN। এটি কেবল মানগুলি মোটেই আরম্ভ করে না।
হেলটনবাইকার

4
None-র জন্য সঠিক চেক হয় myVar is not None, না myVar != None
জাইমে

4
নোটটি np.isnan()স্ট্রিং ভেরিয়েবলের জন্য প্রয়োগ করা হয়নি, সুতরাং আপনি যদি একটি স্ট্রিং পাস করেন তবে এটি ক্রাশ হবে। pd.isnullস্ট্রিংয়ের সাথে কাজ করে এমনটি ব্যবহার করা আরও ভাল ।
মাইকেল

-1

নীচে পার্থক্য রয়েছে:

  • nan শ্রেণীর অন্তর্গত float
  • None শ্রেণীর অন্তর্গত NoneType

আমি নীচের নিবন্ধটি খুব সহায়ক বলে খুঁজে পেয়েছি: https://medium.com/analytics-vidhya/dealing-with-missing-values-nan-and-none-in-python-6fc9b8fb4f31


যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এখানে অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল। লিঙ্কযুক্ত পৃষ্ঠাগুলি পরিবর্তিত হলে লিঙ্ক-শুধুমাত্র উত্তরগুলি অবৈধ হতে পারে। - পর্যালোচনা থেকে
এ। কুত্স্রা

@ এ.কুটস্ত্রা আমি বুঝতে পেরেছি
এসোয়ারী অমিতির্থে এস

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