Why fillna does not work on string values?

Viewed 145

I have a simple data like as below. I'm traying fill inside but does not work

frame like this;

import pandas as pd
import numpy as np

V1 = np.array([1,2,6, np.nan, 7, 1, np.NaN, 9,15])
V4 = np.array(['IT','IK', np.NaN, 'IK','IK','IK','IK','IT','IT'])
df = pd.DataFrame({'sl': V1,
               'departman': V4})

df

gives me:

    sl  departman
0   1.0 IT
1   2.0 IK
2   6.0 nan
3   NaN IK
4   7.0 IK
5   1.0 IK
6   NaN IK
7   9.0 IT
8   15.0IT

After I wrote this;

df['departman'].fillna(df.departman.mode()[0] )

Gives:

0     IT
1     IK
2    nan
3     IK
4     IK
5     IK
6     IK
7     IT
8     IT
Name: departman, dtype: object
1 Answers

I remember this bugged me once in production. Your np.nan is converted to the string "nan" when you create the dataframe. See with:

df.loc[2, 'departman']

and you would get 'nan'. You need to convert the string back to np.nan or use loc:

mask = df['departman'] == 'nan'

Output:

     sl departman
0   1.0        IT
1   2.0        IK
2   6.0        IK
3   NaN        IK
4   7.0        IK
5   1.0        IK
6   NaN        IK
7   9.0        IT
8  15.0        IT
df.loc[mask, 'departman'] = df.loc[~mask, 'departman'].mode()[0]
Related