Why can't I detect the np.nan value in data using np.isnan() in the list comprehension below? Does the list comprehension transform the type of values in some way?
data = pd.DataFrame({'col':['a', 'b', np.nan]})
[print('NaN') if np.isnan(i) else print('Not NaN') for i in data.col]
CodePudding user response:
Yes, you will get into trouble using np.isnan() because of the mixed types in the column. From pandas' docs
Because NaN is a float, a column of integers with even one missing values is cast to floating-point dtype (see Support for integer NA for more)
Therefore you should consider, as @saeedghadiri suggested using pd.isna():
[print('NaN') if pd.isna(i) else print('Not NaN') for i in data.col]
CodePudding user response:
If we look closer to your code, col as 3 values, 'a', 'b' and np.nan. The two first are strings, the third is a np.float.
However, np.isnan is not designed for string types, then it will crash. The following will work
data = pd.DataFrame({'col':[1, 2, np.nan]})
[print('NaN') if np.isnan(i) else print('Not NaN') for i in data.col]
If you want to distinguish np.nan from all object types, you should use pd.isna instead.
CodePudding user response:
I prefer to use pd.isna everytime for checking nans. So your code changes to:
[print('NaN') if pd.isna(i) else print('Not NaN') for i in data.col]
The output would be:
Not NaN
Not NaN
NaN
CodePudding user response:
As stated in the answer here, you have to use pd.isnull(i) instead of np.isnan(i), because the function np.isnan() doesn't work for str type.
[print('NaN') if pd.isnull(i) else print('Not NaN') for i in data.col]
