Numpy isnan () फ़्लोट्स की एक सरणी पर विफल रहता है (पांडा डेटाफ़्रेम लागू से)


100

मेरे पास फ़्लोट्स (कुछ सामान्य संख्या, कुछ नाम) की एक सरणी है जो एक पांडा डेटाफ़्रेम पर एक आवेदन से निकल रही है।

किसी कारण से, numpy.isnan इस सरणी पर विफल हो रहा है, हालांकि जैसा कि नीचे दिखाया गया है, प्रत्येक तत्व एक फ्लोट है, numpy.isnan प्रत्येक तत्व पर सही ढंग से चलता है, चर का प्रकार निश्चित रूप से एक संख्यात्मक सरणी है।

क्या चल रहा है?!

set([type(x) for x in tester])
Out[59]: {float}

tester
Out[60]: 
array([-0.7000000000000001, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan,
   nan, nan], dtype=object)

set([type(x) for x in tester])
Out[61]: {float}

np.isnan(tester)
Traceback (most recent call last):

File "<ipython-input-62-e3638605b43c>", line 1, in <module>
np.isnan(tester)

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''

set([np.isnan(x) for x in tester])
Out[65]: {False, True}

type(tester)
Out[66]: numpy.ndarray

जवाबों:


162

np.isnan देशी dtype के NumPy सरणियों पर लागू किया जा सकता है (जैसे np.float64):

In [99]: np.isnan(np.array([np.nan, 0], dtype=np.float64))
Out[99]: array([ True, False], dtype=bool)

जब ऑब्जेक्ट सरणियों पर लागू होता है, तो टाइपऑयर्स उठाता है:

In [96]: np.isnan(np.array([np.nan, 0], dtype=object))
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इसके बजाय उपयोग कर सकते हैं - यह ऑब्जेक्ट या देशी dtypes के NumPy सरणियों को स्वीकार कर सकता है:

In [97]: pd.isnull(np.array([np.nan, 0], dtype=float))
Out[97]: array([ True, False], dtype=bool)

In [98]: pd.isnull(np.array([np.nan, 0], dtype=object))
Out[98]: array([ True, False], dtype=bool)

ध्यान दें कि Noneऑब्जेक्ट सरणियों में एक शून्य मान भी माना जाता है।


3
धन्यवाद - pd.isnull () का उपयोग किया। किसी भी प्रदर्शन प्रभाव के लिए प्रकट नहीं होता है।
टाइम ६५४३

11

Np.isnan () और pd.isnull () के लिए एक बढ़िया विकल्प है

for i in range(0,a.shape[0]):
    if(a[i]!=a[i]):
       //do something here
       //a[i] is nan

चूँकि केवल नान ही खुद के बराबर नहीं है।


यह सरणियों के लिए काम नहीं कर सकता क्योंकि यह सुप्रसिद्ध "ValueError: xxx का सत्य मान अस्पष्ट है" उठाता है।
MSeifert

@ शेफ़र्ट क्या आप अजगर के बारे में बात कर रहे हैं ? मैं मशीन सीखने में कुछ करने के लिए सिर्फ इस पद्धति का उपयोग करता हूं, मैंने प्रसिद्ध त्रुटि का सामना क्यों नहीं किया?
स्टैथम

हां, ऐसा लगता है जैसे आपने पहले कभी सुन्न या पांडा का इस्तेमाल नहीं किया है। बस import numpy as np; a = np.array([1,2,3, np.nan])अपने कोड का उपयोग करें और चलाएं।
MSeifert

@ सेमीफाइटर एर, मैं नया हूँ, लेकिन मैं कोड के लिए ठीक हूं, कोई त्रुटि नहीं हुई
स्टैथम-

[१] में: np के रूप में सुन्न आयात करें ४]: एक [३] == [एक ३] छपना
स्टेटम

10

@Unutbu उत्तर के शीर्ष पर, आप देशी (फ्लोट64) प्रकार के लिए पंडों को सुन्न वस्तु सरणी ले सकते हैं, लाइन में कुछ

import pandas as pd
pd.to_numeric(df['tester'], errors='coerce')

त्रुटियों को निर्दिष्ट करें = 'कोरे' को स्ट्रिंग्स को मजबूर करने के लिए जो NaN बनने के लिए एक संख्यात्मक मान को पार्स नहीं किया जा सकता है। कॉलम का प्रकार होगा dtype: float64, और फिर isnanचेक काम करना चाहिए


उसका नाम लगता है unutbu;)
Dr_Zaszu

@ Dr_Zaszuś धन्यवाद, निश्चित
सेवेरिन पैपडेक्स

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.