पांडा डेटाफ्रैम में एक कॉलम में NaN मानों की गणना कैसे करें


459

मेरे पास डेटा है, जिसमें मैं संख्या ढूंढना चाहता हूं NaN, ताकि अगर यह किसी सीमा से कम हो, तो मैं इस कॉलम को छोड़ दूंगा। मैंने देखा, लेकिन इसके लिए कोई कार्य नहीं कर पाया। वहाँ है value_counts, लेकिन यह मेरे लिए धीमा होगा, क्योंकि अधिकांश मूल्य अलग हैं और मैं NaNकेवल गिनती चाहता हूं ।

जवाबों:


727

आप isna()विधि का उपयोग कर सकते हैं (या यह उर्फ ​​है isnull()जो पुराने पंडों के संस्करणों के साथ संगत है <0.21.0) और फिर NaN मानों को गिनने के लिए योग। एक कॉलम के लिए:

In [1]: s = pd.Series([1,2,3, np.nan, np.nan])

In [4]: s.isna().sum()   # or s.isnull().sum() for older pandas versions
Out[4]: 2

कई स्तंभों के लिए, यह भी काम करता है:

In [5]: df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]})

In [6]: df.isna().sum()
Out[6]:
a    1
b    2
dtype: int64

31
और अगर आप चाहते हैं कि कुल संख्या में कुल मिलाकर dfआप उपयोग कर सकते हैंdf.isnull().sum().sum()
RockJake28

2
कॉलसम प्राप्त करने के लिए .sum(axis=0), जो कि डिफ़ॉल्ट व्यवहार है। और, rowsums प्राप्त करने के लिए .sum(axis=1)
एसएमसीआई

1
@ RockJake28 याdf.isnull().values.sum()
CS95

3
df['column_name'].isna().sum()अगर कोई सोच रहा है तो भी काम करता है।
सुपरडूपरेरो

93

आप गैर-नैनो मानों की गिनती से कुल लंबाई घटा सकते हैं:

count_nan = len(df) - df.count()

आपको इसे अपने डेटा पर समय देना चाहिए। isnullसमाधान के साथ तुलना में छोटी सीरीज़ को 3x गति मिली ।


4
वास्तव में, यह सबसे अच्छा समय है। यह उस फ्रेम के आकार पर निर्भर करेगा जो मुझे लगता है, एक बड़े फ्रेम (3000 पंक्तियों) के साथ, इसका उपयोग isnullपहले से ही दो गुना तेज है।
जोरिस

5
मैंने इसे उन दोनों तरीकों से आज़माया, जब मैं एक विशाल समूह के लिए समूह की लंबाई की गिनती कर रहा था, जहाँ समूह का आकार आमतौर पर <4 था, और जॉरिस का df.isnull ()। Sum () कम से कम 20x तेज़ था। यह 0.17.1 के साथ था।
नाथन लॉयड

मेरे लिए, दोनों 70,000 पंक्तियों के लिए बहुत कम ना के साथ 3ms औसत से कम हैं।
जोसिया योडर

89

चलो मान लो df कि एक पांडा डेटाफ़्रेम है।

फिर,

df.isnull().sum(axis = 0)

यह हर कॉलम में NaN मान देगा।

यदि आप की जरूरत है, हर पंक्ति में NaN मान,

df.isnull().sum(axis = 1)

46

सबसे मत वाले उत्तर के आधार पर हम एक फ़ंक्शन को आसानी से परिभाषित कर सकते हैं जो हमें अनुपलब्ध मानों और प्रत्येक कॉलम में लापता मानों के% का पूर्वावलोकन करने के लिए एक डेटाफ्रेम देता है:

def missing_values_table(df):
        mis_val = df.isnull().sum()
        mis_val_percent = 100 * df.isnull().sum() / len(df)
        mis_val_table = pd.concat([mis_val, mis_val_percent], axis=1)
        mis_val_table_ren_columns = mis_val_table.rename(
        columns = {0 : 'Missing Values', 1 : '% of Total Values'})
        mis_val_table_ren_columns = mis_val_table_ren_columns[
            mis_val_table_ren_columns.iloc[:,1] != 0].sort_values(
        '% of Total Values', ascending=False).round(1)
        print ("Your selected dataframe has " + str(df.shape[1]) + " columns.\n"      
            "There are " + str(mis_val_table_ren_columns.shape[0]) +
              " columns that have missing values.")
        return mis_val_table_ren_columns

36

पांडा 0.14.1 के बाद से मेरा सुझाव यहाँ value_counts विधि में एक कीवर्ड तर्क दिया गया है:

import pandas as pd
df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]})
for col in df:
    print df[col].value_counts(dropna=False)

2     1
 1     1
NaN    1
dtype: int64
NaN    2
 1     1
dtype: int64

अब तक का सर्वश्रेष्ठ उत्तर, यह अन्य मूल्यों के प्रकारों को भी गिनने की अनुमति देता है।
विस्तृत

19

अगर इसका सिर्फ एक पंडों के कॉलम में नैन मूल्यों को गिनना एक त्वरित तरीका है

import pandas as pd
## df1 as an example data frame 
## col1 name of column for which you want to calculate the nan values
sum(pd.isnull(df1['col1']))

2
sushmit, यदि आपके पास कई कॉलम हैं, तो यह तरीका बहुत जल्दी नहीं है। उस स्थिति में, आपको प्रत्येक कॉलम नाम में कॉपी / पेस्ट करना होगा, फिर कोड को फिर से निष्पादित करना होगा।
आमोस लॉन्ग

17

अगर आप Jupyter Notebook का उपयोग कर रहे हैं, तो कैसे करें…।

 %%timeit
 df.isnull().any().any()

या

 %timeit 
 df.isnull().values.sum()

या, डेटा में कहीं भी NaN हैं, यदि हाँ, तो कहाँ?

 df.isnull().any()

13

नीचे सभी नान कॉलम को अवरोही क्रम में प्रिंट किया जाएगा।

df.isnull().sum().sort_values(ascending = False)

या

नीचे अवरोही क्रम में पहले 15 नैनो कॉलम छपे होंगे।

df.isnull().sum().sort_values(ascending = False).head(15)

10
import numpy as np
import pandas as pd

raw_data = {'first_name': ['Jason', np.nan, 'Tina', 'Jake', 'Amy'], 
        'last_name': ['Miller', np.nan, np.nan, 'Milner', 'Cooze'], 
        'age': [22, np.nan, 23, 24, 25], 
        'sex': ['m', np.nan, 'f', 'm', 'f'], 
        'Test1_Score': [4, np.nan, 0, 0, 0],
        'Test2_Score': [25, np.nan, np.nan, 0, 0]}
results = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'sex', 'Test1_Score', 'Test2_Score'])

results 
'''
  first_name last_name   age  sex  Test1_Score  Test2_Score
0      Jason    Miller  22.0    m          4.0         25.0
1        NaN       NaN   NaN  NaN          NaN          NaN
2       Tina       NaN  23.0    f          0.0          NaN
3       Jake    Milner  24.0    m          0.0          0.0
4        Amy     Cooze  25.0    f          0.0          0.0
'''

आप निम्न फ़ंक्शन का उपयोग कर सकते हैं, जो आपको डेटाफ़्रेम में आउटपुट देगा

  • शून्य मान
  • लापता मूल्य
  • कुल मूल्यों का%
  • कुल शून्य लापता मान
  • % कुल जीरो मिसिंग वैल्यूज
  • डाटा प्रकार

बस निम्नलिखित फ़ंक्शन को कॉपी और पेस्ट करें और इसे अपने पांडा डेटाफ़्रेम को पास करके कॉल करें

def missing_zero_values_table(df):
        zero_val = (df == 0.00).astype(int).sum(axis=0)
        mis_val = df.isnull().sum()
        mis_val_percent = 100 * df.isnull().sum() / len(df)
        mz_table = pd.concat([zero_val, mis_val, mis_val_percent], axis=1)
        mz_table = mz_table.rename(
        columns = {0 : 'Zero Values', 1 : 'Missing Values', 2 : '% of Total Values'})
        mz_table['Total Zero Missing Values'] = mz_table['Zero Values'] + mz_table['Missing Values']
        mz_table['% Total Zero Missing Values'] = 100 * mz_table['Total Zero Missing Values'] / len(df)
        mz_table['Data Type'] = df.dtypes
        mz_table = mz_table[
            mz_table.iloc[:,1] != 0].sort_values(
        '% of Total Values', ascending=False).round(1)
        print ("Your selected dataframe has " + str(df.shape[1]) + " columns and " + str(df.shape[0]) + " Rows.\n"      
            "There are " + str(mz_table.shape[0]) +
              " columns that have missing values.")
#         mz_table.to_excel('D:/sampledata/missing_and_zero_values.xlsx', freeze_panes=(1,0), index = False)
        return mz_table

missing_zero_values_table(results)

उत्पादन

Your selected dataframe has 6 columns and 5 Rows.
There are 6 columns that have missing values.

             Zero Values  Missing Values  % of Total Values  Total Zero Missing Values  % Total Zero Missing Values Data Type
last_name              0               2               40.0                          2                         40.0    object
Test2_Score            2               2               40.0                          4                         80.0   float64
first_name             0               1               20.0                          1                         20.0    object
age                    0               1               20.0                          1                         20.0   float64
sex                    0               1               20.0                          1                         20.0    object
Test1_Score            3               1               20.0                          4                         80.0   float64

यदि आप इसे सरल रखना चाहते हैं तो आप% में लापता मान प्राप्त करने के लिए निम्न फ़ंक्शन का उपयोग कर सकते हैं

def missing(dff):
    print (round((dff.isnull().sum() * 100/ len(dff)),2).sort_values(ascending=False))


missing(results)
'''
Test2_Score    40.0
last_name      40.0
Test1_Score    20.0
sex            20.0
age            20.0
first_name     20.0
dtype: float64
'''

10

शून्य गणना करने के लिए:

df[df == 0].count(axis=0)

NaN की गणना करने के लिए:

df.isnull().sum()

या

df.isna().sum()

8

आप np.nan की value_counts विधि और प्रिंट मान का उपयोग कर सकते हैं

s.value_counts(dropna = False)[np.nan]

अच्छा! यदि आप NaN और गैर- NaN दोनों को गिनना चाहते हैं तो यह सबसे उपयोगी है। s.value_counts(dropna = False)
icemtel



3

यहां Nullकॉलम मानों की गणना के लिए कोड दिया गया है :

df.isna().sum()

3

जुलाई 2017 से एक अच्छा डीज़ोन लेख है जिसमें NaN मूल्यों को सारांशित करने के विभिन्न तरीकों का विवरण है। इसे यहां देखें

मैंने जिस लेख का हवाला दिया है, वह अतिरिक्त मूल्य प्रदान करता है: (1) प्रत्येक कॉलम के लिए NaN को गिनने और प्रदर्शित करने का एक तरीका दिखा रहा है ताकि कोई भी आसानी से यह तय कर सके कि उन कॉलमों को छोड़ना है या नहीं और (2) उन पंक्तियों को चुनने का तरीका दिखाना विशिष्ट जिनके पास NaN होते हैं ताकि वे चुनिंदा रूप से त्याग या अधिरोपित हो सकें।

दृष्टिकोण की उपयोगिता प्रदर्शित करने के लिए यहां एक त्वरित उदाहरण है - केवल कुछ स्तंभों के साथ शायद इसकी उपयोगिता स्पष्ट नहीं है, लेकिन मैंने इसे बड़े डेटा-फ़्रेमों के लिए मदद के लिए पाया।

import pandas as pd
import numpy as np

# example DataFrame
df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]})

# Check whether there are null values in columns
null_columns = df.columns[df.isnull().any()]
print(df[null_columns].isnull().sum())

# One can follow along further per the cited article

3

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

df[df['col_name'].isnull()]['col_name'].shape

2

df.isnull ()। sum () अनुपस्थित मानों का कॉलम-वार योग देगा।

यदि आप किसी विशेष कॉलम में लापता मानों का योग जानना चाहते हैं तो निम्न कोड df.column.isnull () योग करेगा।


1

उस उत्तर के आधार पर जो दिया गया था और कुछ सुधार यह मेरा दृष्टिकोण है

def PercentageMissin(Dataset):
    """this function will return the percentage of missing values in a dataset """
    if isinstance(Dataset,pd.DataFrame):
        adict={} #a dictionary conatin keys columns names and values percentage of missin value in the columns
        for col in Dataset.columns:
            adict[col]=(np.count_nonzero(Dataset[col].isnull())*100)/len(Dataset[col])
        return pd.DataFrame(adict,index=['% of missing'],columns=adict.keys())
    else:
        raise TypeError("can only be used with panda dataframe")

मैं पसंद करता हूंdf.apply(lambda x: x.value_counts(dropna=False)[np.nan]/x.size*100)
के।-माइकल

1

यदि आपको गैर-एनए (गैर-कोई नहीं) और एनए (कोई नहीं) की आवश्यकता होती है, तो ग्रुपबी द्वारा अलग-अलग समूहों में गिना जाता है:

gdf = df.groupby(['ColumnToGroupBy'])

def countna(x):
    return (x.isna()).sum()

gdf.agg(['count', countna, 'size'])

यह गैर-एनए, एनए और प्रति समूह की कुल प्रविष्टियों की संख्या लौटाता है।


0

मेरे कोड में @sushmit द्वारा प्रस्तावित समाधान का उपयोग किया।

उसी का एक संभावित रूपांतर भी हो सकता है

colNullCnt = []
for z in range(len(df1.cols)):
    colNullCnt.append([df1.cols[z], sum(pd.isnull(trainPd[df1.cols[z]]))])

इसका लाभ यह है कि यह df के प्रत्येक कॉलम के लिए परिणाम लौटाता है।


0
import pandas as pd
import numpy as np

# example DataFrame
df = pd.DataFrame({'a':[1,2,np.nan], 'b':[np.nan,1,np.nan]})

# count the NaNs in a column
num_nan_a = df.loc[ (pd.isna(df['a'])) , 'a' ].shape[0]
num_nan_b = df.loc[ (pd.isna(df['b'])) , 'b' ].shape[0]

# summarize the num_nan_b
print(df)
print(' ')
print(f"There are {num_nan_a} NaNs in column a")
print(f"There are {num_nan_b} NaNs in column b")

आउटपुट के रूप में देता है:

     a    b
0  1.0  NaN
1  2.0  1.0
2  NaN  NaN

There are 1 NaNs in column a
There are 2 NaNs in column b

0

मान लें कि आप किसी स्तंभ (श्रृंखला) में लापता मानों की संख्या (NaN) प्राप्त करना चाहते हैं, जिसे डेटाफ़्रेम में समीक्षाएँ कहा जाता है

#import the dataframe
import pandas as pd

reviews = pd.read_csv("../input/wine-reviews/winemag-data-130k-v2.csv", index_col=0)

चर के रूप में n_missing_prices के साथ लापता मान प्राप्त करने के लिए, सरल करें

n_missing_prices = sum(reviews.price.isnull())
print(n_missing_prices)

योग यहाँ की प्रमुख विधि है, इस संदर्भ में उपयोग करने की सही विधि है, इससे पहले कि मुझे एहसास हुआ कि गणना का उपयोग करने की कोशिश कर रहा था


-1

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.count.html#pandas.Series.count

pandas.Series.count
Series.count(level=None)[source]

श्रृंखला में गैर-एनए / अशक्त टिप्पणियों की वापसी संख्या


प्रश्न NA / शून्य मानों की संख्या के बारे में है और विपरीत नहीं है।
बर्न

-1

अपने कार्य के लिए आप pandas.DataFrame.dropna ( https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.dropna.html ) का उपयोग कर सकते हैं :

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': [1, 2, 3, 4, np.nan],
                   'b': [1, 2, np.nan, 4, np.nan],
                   'c': [np.nan, 2, np.nan, 4, np.nan]})
df = df.dropna(axis='columns', thresh=3)

print(df)

Whith थ्रेड पैरामीटर आप DataFrame में सभी कॉलम के लिए NaN मान के लिए अधिकतम गणना की घोषणा कर सकते हैं।

कोड आउटपुट:

     a    b
0  1.0  1.0
1  2.0  2.0
2  3.0  NaN
3  4.0  4.0
4  NaN  NaN
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.