কোনও মান পান্ডস ডেটা ফ্রেমে NaN আছে কিনা তা কীভাবে পরীক্ষা করবেন


482

পাইথন পান্ডসে, কোনও ডেটাফ্রেমের একটি (বা আরও বেশি) এনএন মান আছে কিনা তা যাচাই করার সর্বোত্তম উপায় কী?

আমি ফাংশন সম্পর্কে জানি 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এটির জন্য কোনও বিল্ট ইন ফাংশন নেই। এটি @ জেগ্রিনওয়েলের পোস্ট থেকে সত্য যে এটি df.describe()করতে পারে তবে সরাসরি কোনও কাজ নেই।
hlin117

2
আমি ঠিক সময়সীমা বেঁধেছি df.describe()( NaNগুলি না পেয়ে)। 1000 x 1000 অ্যারে সহ, একটি একক কলটি 1.15 সেকেন্ড সময় নেয়।
hlin117

3
: 1, এছাড়াও, df.isnull().values.sum()চেয়ে একটু দ্রুততরdf.isnull().values.flatten().sum()
জিরো

আহ, ভাল ক্যাচ করুন @ জনগ্যাল্ট - .flatten()পোস্টারিংয়ের জন্য অপসারণের জন্য আমি আমার সমাধান পরিবর্তন করব । ধন্যবাদ।
এস আনন্দ

6
আপনি চেষ্টা করেন নি df.isnull().values.any(), আমার জন্য এটি অন্যদের চেয়ে দ্রুত।
সিকে 1

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

অবশেষে, ডেটাফ্রেমে মোট 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()]
এলমেেক্স 80

49

"এক বা একাধিক NaNs" এর সাথে কতগুলি সারি রয়েছে তা যদি আপনার জানতে হয় :

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

অথবা আপনার যদি এই সারিগুলি বের করে পরীক্ষা করে দেখার দরকার হয়:

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

4
আমি মনে করি আমাদের দ্বিতীয় টি
YOBEN_S


18

হবস উজ্জ্বল উত্তর যুক্ত করে, আমি পাইথন এবং পান্ডসে খুব নতুন তাই আমি ভুল কিনা তা উল্লেখ করুন।

কোন সারিগুলির ন্যান রয়েছে তা সন্ধান করতে:

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

সারিগুলিতে 'সত্য' উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে কোনও () এর অক্ষ 1 হিসাবে নির্দিষ্ট করে ট্রান্সপোজিংয়ের প্রয়োজন ছাড়াই একই ক্রিয়াকলাপটি সম্পাদন করবে।


এতে দুটি ট্রান্সপোজ থেকে মুক্তি পাওয়া যায় ! আপনার সংক্ষিপ্ত any(axis=1)সরলীকরণ পছন্দ।
hobs

12

সুপার সিম্পল সিনট্যাক্স: df.isna().any(axis=None)

V0.23.2 থেকে শুরু করে , আপনি DataFrame.isna+ ব্যবহার করতে পারেন DataFrame.any(axis=None)যেখানে axis=Noneপুরো ডেটা ফ্রেমের উপর লজিকাল হ্রাস নির্দিষ্ট করে।

# 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। উদাহরণস্বরূপ, একক কলামে ন্যান রয়েছে কিনা তা পরীক্ষা করতে,

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। Cf. পান্ডাস উত্স কোড । আমি এই কৌশলটি বেঞ্চমার্ক করি নি, তবে আমি অনুমান করি যে গ্রন্থাগারের লেখকরা এটি কীভাবে করবেন তার জন্য সম্ভবত একটি উপযুক্ত পছন্দ করেছেন choice


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

কেবল ম্যাথ.ইসনান (এক্স) ব্যবহার করে, এক্সটি এনএএন ( সংখ্যা নয়), এবং অন্যথায় মিথ্যা হলে সত্যটি ফেরান


4
আমার মনে math.isnan(x)হয় না কখন xডেটাফ্রেম হয় কাজ করবে। পরিবর্তে আপনি একটি টাইপরর পেতে পারেন।
hlin117

আপনি বিকল্পগুলির মধ্যে কেন এটি ব্যবহার করবেন?
এএমসি

4
df.isnull().sum()

এটি আপনাকে ডেটাফ্রেমের সংশ্লিষ্ট কলামগুলিতে উপস্থিত সমস্ত এনএএন মানগুলির গণনা দেবে।


না, এটি আপনাকে এমন একটি সিরিজ দেবে যা কলামের নাম মানচিত্রের নিজ নিজ সংখ্যাতে মানচিত্র করে।
এএমসি

সংশোধন করা হয়েছে, আমার দোষ: পি
আদর্শ সিংহ

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()?
এএমসি

1

অথবা আপনি ব্যবহার করতে পারেন .info()উপর DFযেমন:

df.info(null_counts=True) যা কলামগুলিতে নন_নুল সারিগুলির সংখ্যা প্রদান করে:

<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

1

সবচেয়ে ভাল ব্যবহার করা হবে:

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

এখানে কেন । সুতরাং isna()সংজ্ঞায়িত করতে ব্যবহৃত হয় isnull(), তবে এই দুটিই অবশ্যই অভিন্ন।

এটি গৃহীত উত্তরের চেয়ে আরও দ্রুত এবং সমস্ত 2 ডি পান্ডার অ্যারেগুলিকে কভার করে।



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

আপনি কেবল কোনও 'এনএন' রয়েছে কিনা তা যাচাই করতে পারেননি তবে নীচের সাহায্যে প্রতিটি কলামে 'এনএন'র শতাংশ পান,

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)

শ্রেণীবদ্ধ ভেরিয়েবলের জন্য ভাল কাজ করে, যখন আপনার অনেক অনন্য মূল্য থাকে তখন এতটা না।


আমি মনে করি এটি অদক্ষ। পান্ডার অন্তর্নির্মিত ফাংশনগুলি আরও ঝরঝরে / জঞ্জাল। আইপথন নোটবুকের চাঞ্চল্য এড়ায়।
কুক

বিল্ট-ইন সমাধানগুলির মাধ্যমে এটি ব্যবহার করার কোনও অর্থ নেই।
এএমসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.