25

I have the following df in pandas.

0       A     B     C
1       2   NaN     8

How can I check if df.iloc[1]['B'] is NaN?

I tried using df.isnan() and I get a table like this:

0       A     B      C
1   false  true  false

but I am not sure how to index the table and if this is an efficient way of performing the job at all?

3 Answers 3

47

Use pd.isnull, for select use loc or iloc:

print (df)
   0  A   B  C
0  1  2 NaN  8

print (df.loc[0, 'B'])
nan

a = pd.isnull(df.loc[0, 'B'])
print (a)
True

print (df['B'].iloc[0])
nan

a = pd.isnull(df['B'].iloc[0])
print (a)
True
Sign up to request clarification or add additional context in comments.

2 Comments

I tried this but I get the following error: TypeError: isnull() takes exactly 1 argument (2 given)
I had written df.isnull(df['B'].iloc[0]) instead of pd.isnull(df['B'].iloc[0]). Thank you this fixed my problem!
3

jezrael response is spot on. If you are only concern with NaN value, I was exploring to see if there's a faster option, since in my experience, summing flat arrays is (strangely) faster than counting. This code seems faster:

df.isnull().values.any()

For example:

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

3 Comments

This does not check a particular cell.
how to check if a particular cell is nan e,g df['colname'].values[0] is empty how to check this pd.isnull - return bool or array depending on value is empty or not empty but its throwing error when used in if condition
for select use loc or iloc:
0

If you are looking for the indexes of NaN in a specific column you can use

list(df['B'].index[df['B'].apply(np.isnan)])

In case you what to get the indexes of all possible NaN values in the dataframe you may do the following

row_col_indexes = list(map(list, np.where(np.isnan(np.array(df)))))
indexes = []
for i in zip(row_col_indexes[0], row_col_indexes[1]):
    indexes.append(list(i))

And if you are looking for a one liner you can use:

list(zip(*[x for x in list(map(list, np.where(np.isnan(np.array(df)))))]))

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.