Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I use if-else statement with python pandas dataframe isna() function?

I'm new to working with pandas dataframes and was trying to figure out a way to locate NaN values inside a cell of a dataframe. I'm using an if condition with isna() function.

My approach is that if the value is NaN, print "value empty" instead of returning a Boolean "True". This is my approach:

import pandas as pd

x= pd.read_csv("mdata_short.csv", header =[0])
print(x["retail_price"].iloc[12:13])
if x["retail_price"].iloc[12:13].isna() == True:
    print("value empty")

I expected a "value empty output", but I'm getting an error saying:

"ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."

I tried removing "== True" part in the IF statement, still getting the same error. I did a google search but couldn't find anything related to this issue. I don't understand where I'm going wrong.

Thank you in advance for your help.

like image 348
Shreyans Bhardwaj Avatar asked May 27 '19 06:05

Shreyans Bhardwaj


2 Answers

series.isna returns a series no matter you call it on whole series or a single item of series. It means your command compares a series to a single True values. Pandas doesn't want to guess how to compare, so it returns that error.

Try this:

if x["retail_price"].iloc[12:13].isna().values[0] == True:
    print('empty')
like image 88
Andy L. Avatar answered Nov 15 '22 04:11

Andy L.


There is problem if select by indexing 12:13 get one element Series, so for scalar use Series.item:

if x["retail_price"].iloc[12:13].isna().item():
    print("value empty")

Another solution is convert values to numpy array and select first value:

if x["retail_price"].iloc[2:3].isna().values[0]:
    print("value empty")

Better is select by scalar value for scalar in output:

if pd.isna(x["retail_price"].iloc[12]):
    print("value empty")

Sample:

x = pd.DataFrame({
    'retail_price': [1,2,np.nan]
})
print (x)
   retail_price
0           1.0
1           2.0
2           NaN

print (x["retail_price"].iloc[2:3].isna())
2    True
Name: retail_price, dtype: bool

print (x["retail_price"].iloc[2:3].isna().item())
True

print (x["retail_price"].iloc[2:3].isna().values[0])
True

print (pd.isna(x["retail_price"].iloc[2]))
True

For comparing in boolean Series (same working for one element Series) check Using If/Truth Statements with pandas.

like image 36
jezrael Avatar answered Nov 15 '22 04:11

jezrael