পাইথন / নম্পপি তালিকা থেকে ন্যানকে আমি কীভাবে সরিয়ে ফেলতে পারি


96

আমার কাছে একটি তালিকা রয়েছে যা মানকে গণনা করে, আমি যে মানগুলি পেয়েছি তার মধ্যে একটি হল 'ন্যান'

countries= [nan, 'USA', 'UK', 'France']

আমি এটি অপসারণ করার চেষ্টা করেছি, তবে আমি প্রতিবারই একটি ত্রুটি পাই

cleanedList = [x for x in countries if (math.isnan(x) == True)]
TypeError: a float is required

যখন আমি এটি চেষ্টা করেছি:

cleanedList = cities[np.logical_not(np.isnan(countries))]
cleanedList = cities[~np.isnan(countries)]

TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

4
এটি স্ট্রিংয়ের মতো দেখায় "nan", প্রকৃত এনএএন মান নয়।
ব্রেইনবার্ন

4
হ্যাঁ, এটি একটি স্ট্রিং। [দেশে x এর জন্য এক্স এক্স = 'নান'!]
MarshalSHI

4
if condition == Trueঅপ্রয়োজনীয়, আপনি সর্বদা খালি করতে পারেন if condition
Reem

এখনও পর্যন্ত সরবরাহিত কোনও সমাধান সন্তোষজনক নয়। আমি একই সমস্যা আছে। মূলত, এটি স্ট্রিংয়ের জন্য কাজ করে না। সুতরাং আপনার ক্ষেত্রে np.isnan('USA')একই ত্রুটি বার্তা প্রেরণ করবে। আমি যদি কোনও সমাধান খুঁজে পাই তবে আমি এটি আপলোড করব।
যোহান ওবাদিয়া

উত্তর:


131

প্রশ্ন পরিবর্তিত হয়েছে, তাই উত্তর আছে:

স্ট্রিংগুলি ব্যবহার করে পরীক্ষা করা যায় না math.isnanকারণ এটি ভাসমান যুক্তির প্রত্যাশা করে। আপনার countriesতালিকায় আপনার কাছে ভাসমান এবং স্ট্রিং রয়েছে।

আপনার ক্ষেত্রে নিম্নলিখিতটি যথেষ্ট হওয়া উচিত:

cleanedList = [x for x in countries if str(x) != 'nan']

পুরানো উত্তর

আপনার countriesতালিকায় আক্ষরিকটি 'nan'একটি স্ট্রিং নয় পাইথন ফ্লোট nanযা এর সমান:

float('NaN')

আপনার ক্ষেত্রে নিম্নলিখিতটি যথেষ্ট হওয়া উচিত:

cleanedList = [x for x in countries if x != 'nan']

4
যৌক্তিকভাবে, আপনি যা বলেন তা সত্য। তবে আমার সাথে এটি কার্যকর হয়নি।
user3001937

তারপরে সমস্যাটি অন্য অঞ্চলে, আপনি যে অ্যারে দিয়েছিলেন সেটি হল স্ট্রিংগুলি যা math.isnanত্রুটিগুলির মাধ্যমে ন্যাচুরাল করবে।

হ্যাঁ ! আমি যখন আউটপুট মুদ্রণ করি তখন আমি এটি পেয়েছিলাম: [ন্যান, 'মার্কিন যুক্তরাষ্ট্র', 'যুক্তরাজ্য', 'ফ্রান্স']
ব্যবহারকারী3001937

4
@ user3001937 আমি উত্তরটি নতুন তথ্যের ভিত্তিতে আপডেট করেছি

4
ঝাংক্সাওচেন: এটি কোনও স্ট্রিং নয়, এটি একটি ভাসা। আপডেট করা উত্তরটি মনোযোগ সহকারে দেখুন; লেগো স্টর্মট্রোপার xএকটি স্ট্রিংয়ে রূপান্তর করছে যাতে আপনি এটি তুলনা করতে পারেন। তুলনা করা হলেও nanসর্বদা ভুল হিসাবে প্রত্যাবর্তন ==করে nan, তাই এটির তুলনা করার এটি সহজতম উপায়।
ফ্রি মনিকা সেলিও

17

সমস্যাটি সত্যটি থেকে আসে যে np.isnan()স্ট্রিংয়ের মানগুলি সঠিকভাবে পরিচালনা করে না। উদাহরণস্বরূপ, যদি আপনি এটি করেন:

np.isnan("A")
TypeError: ufunc 'isnan' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

তবে পান্ডাস সংস্করণটি pd.isnull()সংখ্যা এবং স্ট্রিং মানগুলির জন্য কাজ করে:

pd.isnull("A")
> False

pd.isnull(3)
> False

pd.isnull(np.nan)
> True

pd.isnull(None)
> True

15

আপনার উদাহরণ ব্যবহার করে যেখানে ...

countries= [nan, 'USA', 'UK', 'France']

যেহেতু নান নান (নান! = ন্যান) এবং দেশগুলির সমান নয় [0] = ন্যান, আপনার নিম্নলিখিতটি পর্যবেক্ষণ করা উচিত:

countries[0] == countries[0]
False

যাহোক,

countries[1] == countries[1]
True
countries[2] == countries[2]
True
countries[3] == countries[3]
True

সুতরাং, নিম্নলিখিতগুলি কাজ করা উচিত:

cleanedList = [x for x in countries if x == x]

4
এই কেবলমাত্র উত্তরটি যখন কাজ করে আপনি যখন স্ট্রিংয়ের তালিকায় একটি ফ্লোট ('নান')
রাখেন

13
import numpy as np

mylist = [3, 4, 5, np.nan]
l = [x for x in mylist if ~np.isnan(x)]

এটি সমস্ত NaN অপসারণ করা উচিত। অবশ্যই, আমি ধরে নিই যে এটি এখানে একটি স্ট্রিং নয় বরং প্রকৃত NaN ( np.nan)।


4
এটি আমাকে ত্রুটি দেয়: TypeError: ufunc 'isnan' ইনপুট প্রকারের জন্য সমর্থিত নয়, এবং castালাইয়ের নিয়ম '' নিরাপদ '' অনুযায়ী ইনপুটগুলি কোনও সমর্থিত প্রকারের সাথে নিরাপদে জোর করা যায়নি
জাক কেইরন

4
কেন নয় কেবল: x[~ np.isnan(x)]? শূন্যে কোনও তালিকা বোঝার প্রয়োজন নেই। অবশ্যই, আমি ধরে নিচ্ছি এক্স একটি নির্লজ্জ অ্যারে।
বুধবার

আমি ধরে নিয়েছি এক্স প্রশ্নের মতো সাজানো হিসাবে একটি অদ্ভুত অ্যারে হবে না।
অজয় শাহ

এটা ভাসা আশা করবে। @ জাককির্ন
শিরীশ বাজপাই

6

যদি আপনি উপাদান ধরনের পরীক্ষা করে দেখুন

type(countries[1])

ফলাফলটি এমন হবে <class float> যাতে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন:

[i for i in countries if type(i) is not float]



2

এটি করার আর একটি উপায় এর মধ্যে ফিল্টার ব্যবহার করা অন্তর্ভুক্ত থাকবে :

countries = list(filter(lambda x: str(x) != 'nan', countries))

1

আপনার উদাহরণে 'nan'একটি স্ট্রিং তাই পরিবর্তে isnan()কেবল স্ট্রিংয়ের জন্য পরীক্ষা করুন

এটার মত:

cleanedList = [x for x in countries if x != 'nan']

-1

আমি লক্ষ্য করেছি যে পান্ডারা উদাহরণস্বরূপ ফাঁকা মানগুলির জন্য 'নান' ফিরিয়ে দেবে। যেহেতু এটি কোনও স্ট্রিং নয় এটির সাথে এটির মিলের জন্য আপনাকে এটিকে রূপান্তর করতে হবে। উদাহরণ স্বরূপ:

ulist = df.column1.unique() #create a list from a column with Pandas which 
for loc in ulist:
    loc = str(loc)   #here 'nan' is converted to a string to compare with if
    if loc != 'nan':
        print(loc)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.