পান্ডাস ডেটা ফ্রেমের একটি কলামে কীভাবে NaN মানগুলি গণনা করা যায়


459

আমার কাছে ডেটা রয়েছে, যার মধ্যে আমি সংখ্যাটি খুঁজতে চাই NaN, যাতে এটি যদি কিছু প্রান্তিকের চেয়ে কম হয় তবে আমি এই কলামগুলি বাদ দেব। আমি তাকিয়েছি, কিন্তু এর জন্য কোনও কার্যকারিতা খুঁজে পাইনি। আছে value_counts, তবে এটি আমার পক্ষে ধীর হবে, কারণ বেশিরভাগ মান পৃথক এবং আমি NaNকেবল গণনা করতে চাই ।

উত্তর:


727

আপনি isna()পদ্ধতিটি ব্যবহার করতে পারেন (বা এটির নাম isnull()যা পুরানো পান্ডাস সংস্করণ <0.21.0 এর সাথেও সামঞ্জস্যপূর্ণ) এবং তারপরে Na মানগুলি গণনা করতে পারে। একটি কলামের জন্য:

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
এবং আপনি যদি মোট মোট dfdf.isnull().sum().sum()
ন্যানটি

2
কলসাম পেতে, .sum(axis=0)এটি পূর্বনির্ধারিত আচরণ। এবং, rowsums পেতে .sum(axis=1)
smci

1
@ রকজেক 28 বাdf.isnull().values.sum()
সিএস 95

3
df['column_name'].isna().sum()কেউ যদি ভাবছেন তবে কাজ করে।
সুপারডুপারেরো

93

আপনি নন-ন্যানের মান গণনা থেকে মোট দৈর্ঘ্য বিয়োগ করতে পারেন :

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

আপনার এটি আপনার ডেটাতে সময় দেওয়া উচিত। ছোট সিরিজের জন্য isnullসমাধানের তুলনায় একটি 3x গতি বাড়িয়েছে ।


4
প্রকৃতপক্ষে, এটি সেরা সময়। এটি আমার মনে হয় এমন ফ্রেমের আকারের উপর নির্ভর করবে, বৃহত্তর ফ্রেম (3000 সারি) সহ, isnullএটি ইতিমধ্যে এর চেয়ে দ্বিগুণ দ্রুত ব্যবহার করছে।
জরিস

5
আমি এটি উভয় উপায়েই চেষ্টা করেছিলাম যেখানে আমি একটি বিশাল গ্রুপবাইয়ের জন্য গ্রুপের দৈর্ঘ্য গণনা করছি যেখানে গ্রুপের মাপ সাধারণত <4 থাকে এবং জোরিসের df.isnull () যোগফল () কমপক্ষে 20x দ্রুত ছিল। এটি ছিল 0.17.1।
নাথান লয়েড

আমার জন্য, উভয়ই খুব কম na এর সাথে 70,000 সারিগুলির গড় 3 মিমির নীচে।
জোশিয়ার যোদার

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
সুস্মিত, আপনার কাছে প্রচুর কলাম রয়েছে এই পদ্ধতিটি খুব দ্রুত নয়। সেক্ষেত্রে আপনাকে প্রতিটি কলামের নাম অনুলিপি করে আটকে দিতে হবে, তারপরে কোডটি পুনরায় কার্যকর করতে হবে।
আমোস লং

17

আপনি যদি জপিটার নোটবুক ব্যবহার করেন তবে কীভাবে ....

 %%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 এর মান_ অ্যাকাউন্টগুলি পদ্ধতি এবং মুদ্রণের মানগুলি ব্যবহার করতে পারেন

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

নিস! আপনি যদি NaN এবং নন- এনএন উভয়ই গণনা করতে চান তবে এটি সবচেয়ে কার্যকর। s.value_counts(dropna = False)
আইসমেটেল 5'19




3

জুলাই ২০১ from থেকে একটি দুর্দান্ত Dzone নিবন্ধ রয়েছে যা NAN মানগুলি সংক্ষিপ্ত করার বিভিন্ন উপায়ের বিশদ দেয়। এটি এখানে দেখুন

আমি যে নিবন্ধটি উদ্ধৃত করেছি তা এর দ্বারা অতিরিক্ত মান সরবরাহ করে: (1) প্রতিটি কলামের জন্য এনএএন গণনা গণনা এবং প্রদর্শন করার জন্য একটি উপায় দেখানো যাতে কোনওগুলি সহজেই সিদ্ধান্ত নিতে পারে যে এই কলামগুলি বাতিল করতে হবে এবং (২) এই সারিগুলিকে নির্বাচন করার জন্য একটি উপায় প্রদর্শন করা সুনির্দিষ্ট যা 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 ()। যোগফল () কমে যাওয়া মানগুলির কলাম-ভিত্তিক যোগফল দেবে।

যদি আপনি কোনও নির্দিষ্ট কলামে অনুপস্থিত মানের যোগফল জানতে চান তবে নিম্নলিখিত কোডটি df.column.isnull () ব্যবহার করবে sum যোগ ()


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

আমার কোডে @ সুস্মিত দ্বারা প্রস্তাবিত সমাধানটি ব্যবহার করুন।

একই সম্ভাব্য প্রকরণও হতে পারে

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

মনে করুন আপনি রিভিউ নামক ডেটাফ্রেমে মূল্য হিসাবে পরিচিত একটি কলামে (সিরিজ) হারিয়ে যাওয়া মানগুলির (এনএএন) পেতে চান

#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/references/api/pandas.DataFrame.rodna.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)

ত্রিশ প্যারামিটারের সাহায্যে আপনি ডেটাফ্রেমে সমস্ত কলামের জন্য 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.