कुशलतापूर्वक जाँच करना कि क्या मनमानी वस्तु पायथन / सुन्न / पांडा में NaN है?


101

मेरे सुन्न सरणियों np.nanलापता मूल्यों को नामित करने के लिए उपयोग करते हैं। जैसा कि मैंने डेटा सेट पर पुनरावृति की, मुझे ऐसे लापता मूल्यों का पता लगाने और उन्हें विशेष तरीकों से संभालने की आवश्यकता है।

Naively मैंने उपयोग किया numpy.isnan(val), जो तब तक अच्छी तरह से काम करता है जब तक valकि समर्थित प्रकारों के सबसेट के बीच न हो numpy.isnan()। उदाहरण के लिए, स्ट्रिंग फ़ील्ड में अनुपलब्ध डेटा हो सकता है, जिस स्थिति में मुझे मिलता है:

>>> np.isnan('some_string')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Not implemented for this type

महंगे रैपर लिखने के अलावा जो अपवाद और रिटर्न को पकड़ता है False, क्या उसे इस कुशलता से और कुशलता से संभालने का कोई तरीका है?


8
pandasहै pandas.isnull(): मुझे यकीन नहीं है कि अगर यह आपकी आवश्यकताओं को पूरा करता है, तो कुछ उदाहरण डेटा अच्छा हो सकता है।
मारियस

4
@ मार्स: pandas.isnull()पूरी तरह से काम करने लगता है। एकमात्र डेटा प्रकार जो मैं वर्तमान में काम कर रहा हूं numpy.isnan(), जो टूट गया है वह स्ट्रिंग है, और pandas.isnull()इसे अच्छी तरह से संभालता है। वास्तव में, यह अच्छी तरह से किसी भी मनमानी वस्तु को संभालने के लिए लगता है जो मैंने इसे फेंक दिया था। क्या आप के बारे में कोई विशेष मुद्दे थे? अन्यथा, आप अपनी टिप्पणी को पूर्ण उत्तर के रूप में प्रस्तुत करना चाह सकते हैं, क्योंकि यह विहित उत्तर की तरह लगता है, कम से कम पांडा उपयोगकर्ताओं के लिए।
डन पील

जवाबों:


169

pandas.isnull()( pd.isna()नए संस्करणों में भी ) संख्यात्मक और स्ट्रिंग / ऑब्जेक्ट सरणियों में लापता मानों की जांच करता है। प्रलेखन से, यह जांच करता है:

संख्यात्मक सरणियों में NaN, वस्तु सरणियों में कोई नहीं / NaN

त्वरित उदाहरण:

import pandas as pd
import numpy as np
s = pd.Series(['apple', np.nan, 'banana'])
pd.isnull(s)
Out[9]: 
0    False
1     True
2    False
dtype: bool

numpy.nanलापता मूल्यों का प्रतिनिधित्व करने के लिए उपयोग करने का विचार कुछ ऐसा है जो pandasपेश किया गया है, जिसके कारण pandasइसके साथ निपटने के लिए उपकरण हैं।

डेटाटाइम भी (यदि आप उपयोग करते pd.NaTहैं तो आपको dtype को निर्दिष्ट करने की आवश्यकता नहीं होगी)

In [24]: s = Series([Timestamp('20130101'),np.nan,Timestamp('20130102 9:30')],dtype='M8[ns]')

In [25]: s
Out[25]: 
0   2013-01-01 00:00:00
1                   NaT
2   2013-01-02 09:30:00
dtype: datetime64[ns]``

In [26]: pd.isnull(s)
Out[26]: 
0    False
1     True
2    False
dtype: bool

19

क्या आपका प्रकार वास्तव में मनमाना है? यदि आप जानते हैं कि यह सिर्फ एक इंट फ्लोट या स्ट्रिंग होने वाला है तो आप बस कर सकते हैं

 if val.dtype == float and np.isnan(val):

यह मानते हुए कि यह सुन्न में लिपटे हुए है, इसमें हमेशा एक dtype होगा और केवल नाव और जटिल NaN हो सकता है


मैं कई तरह के डेटा के साथ काम कर रहा हूं। हालांकि अधिकांश कॉलम में इंट * या फ्लोट * डेटा प्रकार होते हैं, जबकि अन्य कोई भी वस्तु हो सकते हैं, हालांकि अभी तक मेरे द्वारा उपयोग किया जाने वाला एकमात्र प्रकार स्ट्रिंग था।
डन पील

अजगर में स्ट्रिंग्स नहीं है dtype। आपको करना होगाtype(val) == 'float'
pvarma

4
type(val) == float and np.isnan(val)- मेरे लिए काम किया
डैनी कलन

@ user1930402 मैं मान रहा हूं कि ये नियमित रूप से अजगर नहीं हैं। उदाहरण के लिए: np.array (["हैलो")] [0] .डाइप कार्य करता है लेकिन ["हैलो"] [0] .डाइप नहीं करता है
हैमर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.