मैं पायन / न्यूमपी को सूची से कैसे हटा सकता हूं


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", वास्तविक NaN मान नहीं।
ब्रेनबार

1
हाँ, यह एक स्ट्रिंग है। [देशों में x के लिए x अगर x! = 'nan' है
MarshalSHI

4
if condition == Trueअनावश्यक है, आप हमेशा बस कर सकते हैं if condition
रीम

अब तक प्रदान किया गया कोई भी समाधान संतोषजनक नहीं है। मेरी भी यही समस्या है। मूल रूप से, यह स्ट्रिंग्स के लिए काम नहीं करता है। इसलिए आपके मामले 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']

1
तार्किक रूप से, आप जो कहते हैं वह सच है। लेकिन यह मेरे साथ काम नहीं किया।
user3001937

फिर समस्या एक अन्य क्षेत्र में है, आपके द्वारा दी गई सरणी स्ट्रिंग है जो math.isnanत्रुटियों के माध्यम से समाप्त हो जाएगी।

हाँ ! जब मैं आउटपुट प्रिंट करता हूं, तो मुझे यह मिला: [nan, 'USA', 'UK', 'France']
user3001937

1
@ user3001937 मैंने नई जानकारी के आधार पर उत्तर अपडेट किया है

2
zhangxaochen: यह एक स्ट्रिंग नहीं है, यह एक फ्लोट है। अपडेट किए गए उत्तर को ध्यान से देखें; लेगो स्ट्रोमट्रोप्र 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]

1
यह एकमात्र उत्तर है जो तब काम करता है जब आपके पास स्ट्रिंग्स की सूची में एक फ्लोट ('नेन')
kmundnic

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) है।


1
यह मुझे त्रुटि देता है: TypeError: ufunc 'isnan' इनपुट प्रकारों के लिए समर्थित नहीं है, और इनपुट को किसी भी समर्थित प्रकार के लिए कास्टिंग नियम '' safe '' के अनुसार सुरक्षित नहीं किया जा सकता है
Zak Keirn

1
बस क्यों नहीं x[~ np.isnan(x)]:? सुन्न में आवश्यक कोई सूची समझ नहीं। बेशक, मुझे लगता है कि x एक संख्यात्मक सरणी है।
bue

मैंने मान लिया है कि x एक सुव्यवस्थित सारणी नहीं है जैसा कि प्रश्न का सुझाव दिया गया है।
अजय शाह

यह तैरने की उम्मीद करेगा। तार के साथ सूचियों पर काम नहीं करेंगे @ZakKeirn
शिरीष बाजपेई

7

मैं इस तरह की सूची से गायब मूल्यों को निकालना पसंद करता हूं:

list_no_nan = [x for x in list_with_nan if pd.notnull(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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.