यदि पंडों के डाटाफ्रेम में कोई मान नहीं है तो कैसे जांच करें


482

पायथन पंडों में, यह जांचने का सबसे अच्छा तरीका है कि क्या डेटाफ़्रेम में एक (या अधिक) NaN मान है?

मुझे फ़ंक्शन के बारे में पता है pd.isnan, लेकिन यह प्रत्येक तत्व के लिए बूलियन का डेटाफ़्रेम देता है। यह पोस्ट यहीं मेरे प्रश्न का उत्तर नहीं देता है।


जवाबों:


577

jwilner की प्रतिक्रिया हाजिर है। मैं यह देखने के लिए खोज कर रहा था कि क्या कोई तेज विकल्प है, क्योंकि मेरे अनुभव में, समतल सरणियों की गणना गिनती की तुलना में (अजीब तरह से) तेज है। यह कोड तेज़ लगता है:

df.isnull().values.any()

उदाहरण के लिए:

In [2]: df = pd.DataFrame(np.random.randn(1000,1000))

In [3]: df[df > 0.9] = pd.np.nan

In [4]: %timeit df.isnull().any().any()
100 loops, best of 3: 14.7 ms per loop

In [5]: %timeit df.isnull().values.sum()
100 loops, best of 3: 2.15 ms per loop

In [6]: %timeit df.isnull().sum().sum()
100 loops, best of 3: 18 ms per loop

In [7]: %timeit df.isnull().values.any()
1000 loops, best of 3: 948 µs per loop

df.isnull().sum().sum()थोड़ा धीमा है, लेकिन निश्चित रूप से, अतिरिक्त जानकारी है - की संख्या NaNs


1
समय बेंचमार्क के लिए धन्यवाद। यह आश्चर्य की बात है कि pandasइसके लिए एक निर्मित कार्य नहीं है। यह @ JGreenwell के पोस्ट से सच है जो df.describe()ऐसा कर सकता है, लेकिन कोई प्रत्यक्ष कार्य नहीं।
hlin117

2
मैं सिर्फ समय पर df.describe()(बिना खोजने के NaN)। 1000 x 1000 सरणी के साथ, एक सिंगल कॉल में 1.15 सेकंड लगते हैं।
hlin117

3
: 1, इसके अलावा, df.isnull().values.sum()की तुलना में थोड़ा तेज हैdf.isnull().values.flatten().sum()
शून्य

आह, अच्छा पकड़ @JohnGalt - मैं पोस्टिंग के लिए हटाने के .flatten()लिए अपना समाधान बदल दूंगा। धन्यवाद।
एस आनंद

6
आपने कोशिश नहीं की df.isnull().values.any(), मेरे लिए यह दूसरों की तुलना में तेज़ है।
CK1

178

आपके पास विकल्पों की एक जोड़ी है।

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10,6))
# Make a few areas have NaN values
df.iloc[1:3,1] = np.nan
df.iloc[5,3] = np.nan
df.iloc[7:9,5] = np.nan

अब डेटा फ्रेम कुछ इस तरह दिखता है:

          0         1         2         3         4         5
0  0.520113  0.884000  1.260966 -0.236597  0.312972 -0.196281
1 -0.837552       NaN  0.143017  0.862355  0.346550  0.842952
2 -0.452595       NaN -0.420790  0.456215  1.203459  0.527425
3  0.317503 -0.917042  1.780938 -1.584102  0.432745  0.389797
4 -0.722852  1.704820 -0.113821 -1.466458  0.083002  0.011722
5 -0.622851 -0.251935 -1.498837       NaN  1.098323  0.273814
6  0.329585  0.075312 -0.690209 -3.807924  0.489317 -0.841368
7 -1.123433 -1.187496  1.868894 -2.046456 -0.949718       NaN
8  1.133880 -0.110447  0.050385 -1.158387  0.188222       NaN
9 -0.513741  1.196259  0.704537  0.982395 -0.585040 -1.693810
  • विकल्प 1 : df.isnull().any().any()- यह एक बूलियन मान लौटाता है

आपको पता है कि isnull()कौन सी डेटाफ़्रेम इस तरह लौटेगी:

       0      1      2      3      4      5
0  False  False  False  False  False  False
1  False   True  False  False  False  False
2  False   True  False  False  False  False
3  False  False  False  False  False  False
4  False  False  False  False  False  False
5  False  False  False   True  False  False
6  False  False  False  False  False  False
7  False  False  False  False  False   True
8  False  False  False  False  False   True
9  False  False  False  False  False  False

यदि आप इसे बनाते हैं df.isnull().any(), तो आप केवल उन कॉलमों को पा सकते हैं जिनमें NaNमान हैं:

0    False
1     True
2    False
3     True
4    False
5     True
dtype: bool

.any()यदि उपरोक्त में से कोई भी हो तो एक और आपको बताएगाTrue

> df.isnull().any().any()
True
  • विकल्प 2 : df.isnull().sum().sum()- यह NaNमानों की कुल संख्या का पूर्णांक देता है:

यह उसी तरह से कार्य .any().any()करता है, जैसे पहले NaNकिसी कॉलम में मानों की संख्या का योग देकर , फिर उन मानों का योग:

df.isnull().sum()
0    0
1    2
2    0
3    1
4    0
5    2
dtype: int64

अंत में, DataFrame में NaN मानों की कुल संख्या प्राप्त करने के लिए:

df.isnull().sum().sum()
5

के .any(axis=None)बजाय का उपयोग क्यों नहीं .any().any()?
जार्ज

57

यह जानने के लिए कि किसी विशिष्ट कॉलम में कौन सी पंक्तियाँ NaN हैं:

nan_rows = df[df['name column'].isnull()]

17
पता लगाने के लिए कौन-सी पंक्तियां ख़ास कॉलम में Nans की जरूरत नहीं है: non_nan_rows = df[df['name column'].notnull()]
Elmex80s

49

यदि आपको यह जानने की आवश्यकता है कि "एक या अधिक NaNs" के साथ कितनी पंक्तियाँ हैं :

df.isnull().T.any().T.sum()

या अगर आपको इन पंक्तियों को बाहर निकालने और उनकी जांच करने की आवश्यकता है:

nan_rows = df[df.isnull().T.any().T]

4
मुझे लगता है कि हमें
बजे


18

हॉब्स के शानदार उत्तर को जोड़ते हुए, मैं पाइथन और पंडों के लिए बहुत नया हूं इसलिए कृपया मुझे गलत होने पर इंगित करें।

यह जानने के लिए कि किन पंक्तियों में NaN हैं:

nan_rows = df[df.isnull().any(1)]

यदि कोई 'ट्रू' पंक्तियों में मौजूद है, यह जाँचने के लिए 1 के रूप में किसी की धुरी को निर्दिष्ट करके ट्रांसपोज़िंग की आवश्यकता के बिना एक ही ऑपरेशन करेगा।


इससे दो पारगमन से छुटकारा मिलता है! अपने संक्षिप्त any(axis=1)सरलीकरण से प्यार करें ।
हॉब्स

12

सुपर सिंपल सिंटेक्स: df.isna().any(axis=None)

V0.23.2 से शुरू होकर , आप उपयोग कर सकते हैं DataFrame.isna+ DataFrame.any(axis=None)जहाँ axis=Noneपूरे DataFrame पर तार्किक कमी बताई गई है।

# Setup
df = pd.DataFrame({'A': [1, 2, np.nan], 'B' : [np.nan, 4, 5]})
df
     A    B
0  1.0  NaN
1  2.0  4.0
2  NaN  5.0

df.isna()

       A      B
0  False   True
1  False  False
2   True  False

df.isna().any(axis=None)
# True

उपयोगी विकल्प

numpy.isnan
यदि आप पंडों के पुराने संस्करण चला रहे हैं तो एक और अच्छा विकल्प।

np.isnan(df.values)

array([[False,  True],
       [False, False],
       [ True, False]])

np.isnan(df.values).any()
# True

वैकल्पिक रूप से, राशि की जाँच करें:

np.isnan(df.values).sum()
# 2

np.isnan(df.values).sum() > 0
# True

Series.hasnans
आप पुनरावृति से भी कॉल कर सकते हैं Series.hasnans। उदाहरण के लिए, यह जाँचने के लिए कि क्या एकल कॉलम में NaN है,

df['A'].hasnans
# True

और यह जांचने के लिए कि क्या किसी कॉलम में NaN है, आप any(जो एक शॉर्ट-सर्कुलेटिंग ऑपरेशन है) के साथ एक समझ का उपयोग कर सकते हैं ।

any(df[c].hasnans for c in df)
# True

यह वास्तव में बहुत तेज है।


10

चूंकि किसी ने उल्लेख नहीं किया है, इसलिए केवल एक और चर कहा जाता है hasnans

df[i].hasnansTrueयदि पंडों की श्रृंखला में कोई एक या अधिक मान NaN है, तो इसका उत्पादन होगा ।False तो नहीं है। ध्यान दें कि इसका कार्य नहीं है।

पांडा संस्करण '0.19.2' और '0.20.2'


6
यह उत्तर गलत है। पंडों की श्रृंखला में यह विशेषता है लेकिन डेटाफ्रेम नहीं है। यदि df = DataFrame([1,None], columns=['foo']), तो df.hasnansएक फेंक देंगे AttributeError, लेकिन df.foo.hasnansवापस आ जाएंगे True
नाथन थॉम्पसन

7

चूंकि pandasइसके लिए यह पता लगाना है DataFrame.dropna(), इसलिए मैंने यह देखने के लिए कि वे इसे कैसे लागू करते हैं और यह पता लगाया कि उन्होंने इसका उपयोग किया है DataFrame.count(), जो सभी गैर-शून्य मानों को गिनता है DataFrame। सी एफ पांडा स्रोत कोड । मैंने इस तकनीक को बेंचमार्क नहीं किया है, लेकिन मुझे लगता है कि पुस्तकालय के लेखकों ने यह करने के लिए एक बुद्धिमान विकल्प बनाया है।


6

चलो dfपांडा DataFrame का नाम और वह यह है कि किसी भी मूल्य हो numpy.nanएक शून्य मान है।

  1. यदि आप यह देखना चाहते हैं कि कौन से कॉलम में नल हैं और कौन से नहीं (सिर्फ सही और गलत)
    df.isnull().any()
  2. यदि आप केवल उन कॉलम को देखना चाहते हैं जिनमें नल हैं
    df.loc[:, df.isnull().any()].columns
  3. यदि आप हर कॉलम में नल की गिनती देखना चाहते हैं
    df.isna().sum()
  4. यदि आप प्रत्येक कॉलम में नल का प्रतिशत देखना चाहते हैं

    df.isna().sum()/(len(df))*100
  5. यदि आप केवल नल के साथ कॉलम में नल का प्रतिशत देखना चाहते हैं: df.loc[:,list(df.loc[:,df.isnull().any()].columns)].isnull().sum()/(len(df))*100

संपादित करें 1:

यदि आप यह देखना चाहते हैं कि आपका डेटा कहाँ गायब है:

import missingno
missingdata_df = df.columns[df.isnull().any()].tolist()
missingno.matrix(df[missingdata_df])

यदि आप हर कॉलम में नल की गिनती देखना चाहते हैं ... तो यह पागल लगता है, बस क्यों नहीं df.isna().sum()?
एएमसी

4

बस math.isnan (x) का उपयोग कर , रिटर्न ट्रू अगर x एक NaN (संख्या नहीं) है, और अन्यथा गलत है।


4
मुझे नहीं लगता कि math.isnan(x)जब xDataFrame काम करने वाला है। आपको इसके बजाय एक TypeError मिलती है।
19-28 को hlin117

आप किसी भी विकल्प पर इसका उपयोग क्यों करेंगे?
एएमसी

4
df.isnull().sum()

यह आपको DataFrame के संबंधित coloums में मौजूद सभी NaN मानों की गिनती देगा।


नहीं, यह आपको एक श्रृंखला देगा जो कॉलम नामों को उनके संबंधित एनए मानों के लिए मैप करता है।
एएमसी

सही किया, मेरी गलती: पी
आदर्श सिंह

3

यहां एक गणना मूल्य के साथ अशक्त खोजने और बदलने का एक और दिलचस्प तरीका है

    #Creating the DataFrame

    testdf = pd.DataFrame({'Tenure':[1,2,3,4,5],'Monthly':[10,20,30,40,50],'Yearly':[10,40,np.nan,np.nan,250]})
    >>> testdf2
       Monthly  Tenure  Yearly
    0       10       1    10.0
    1       20       2    40.0
    2       30       3     NaN
    3       40       4     NaN
    4       50       5   250.0

    #Identifying the rows with empty columns
    nan_rows = testdf2[testdf2['Yearly'].isnull()]
    >>> nan_rows
       Monthly  Tenure  Yearly
    2       30       3     NaN
    3       40       4     NaN

    #Getting the rows# into a list
    >>> index = list(nan_rows.index)
    >>> index
    [2, 3]

    # Replacing null values with calculated value
    >>> for i in index:
        testdf2['Yearly'][i] = testdf2['Monthly'][i] * testdf2['Tenure'][i]
    >>> testdf2
       Monthly  Tenure  Yearly
    0       10       1    10.0
    1       20       2    40.0
    2       30       3    90.0
    3       40       4   160.0
    4       50       5   250.0

3

मैं निम्नलिखित का उपयोग कर रहा हूं और इसे एक स्ट्रिंग पर टाइप कर रहा हूं और नैनो मूल्य के लिए जांच कर रहा हूं

   (str(df.at[index, 'column']) == 'nan')

यह मुझे एक श्रृंखला में विशिष्ट मूल्य की जांच करने की अनुमति देता है और न केवल वापस लौटाता है अगर यह श्रृंखला के भीतर कहीं निहित है।


क्या इस ओवर का उपयोग करने का कोई फायदा है pandas.isna()?
एएमसी

2

सबसे अच्छा उपयोग करना होगा:

df.isna().any().any()

यहाँ क्यों है । तो isna()परिभाषित करने के लिए उपयोग किया जाता है isnull(), लेकिन ये दोनों समान हैं।

यह स्वीकृत उत्तर की तुलना में भी तेज है और सभी 2D पांडा सरणियों को कवर करता है।


1

या आप .info()इस DFतरह से उपयोग कर सकते हैं :

df.info(null_counts=True) जो कॉलम में गैर_null पंक्तियों की संख्या लौटाता है जैसे:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 3276314 entries, 0 to 3276313
Data columns (total 10 columns):
n_matches                          3276314 non-null int64
avg_pic_distance                   3276314 non-null float64


0
df.apply(axis=0, func=lambda x : any(pd.isnull(x)))

प्रत्येक कॉलम के लिए जाँच करेगा कि उसमें नान है या नहीं।


किसी भी अंतर्निहित समाधान पर इसका उपयोग क्यों करें?
एएमसी

0

हम सीबॉर्न मॉड्यूल हीटमैप का उपयोग करके हीटमैप उत्पन्न करके डेटासेट में मौजूद अशक्त मूल्यों को देख सकते हैं

import pandas as pd
import seaborn as sns
dataset=pd.read_csv('train.csv')
sns.heatmap(dataset.isnull(),cbar=False)

-1

आप न केवल यह देख सकते हैं कि कोई 'NaN' मौजूद है बल्कि निम्न का उपयोग करके प्रत्येक कॉलम में 'NaN का प्रतिशत प्राप्त करें'

df = pd.DataFrame({'col1':[1,2,3,4,5],'col2':[6,np.nan,8,9,10]})  
df  

   col1 col2  
0   1   6.0  
1   2   NaN  
2   3   8.0  
3   4   9.0  
4   5   10.0  


df.isnull().sum()/len(df)  
col1    0.0  
col2    0.2  
dtype: float64

-2

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

for col in df:
   print df[col].value_counts(dropna=False)

श्रेणीबद्ध चर के लिए अच्छी तरह से काम करता है, इतना नहीं जब आपके पास कई अद्वितीय मूल्य होते हैं।


मुझे लगता है कि यह अक्षम है। पंडों के अंतर्निहित कार्य अधिक साफ / सुव्यवस्थित हैं। IPython नोटबुक के अव्यवस्था से बचा जाता है।
कू

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