Dealing with NaN values


In [1]:
import pandas as pd
import numpy as np
from plydata import call

In [2]:
df = pd.DataFrame({
    'w': [1, 2, np.nan, 4, 5],
    'x': [np.nan, 2, np.nan, 4, 5],
    'y': [np.nan] * 4 + [5],
    'z': [np.nan] * 5
})
df


Out[2]:
w x y z
0 1.0 NaN NaN NaN
1 2.0 2.0 NaN NaN
2 NaN NaN NaN NaN
3 4.0 4.0 NaN NaN
4 5.0 5.0 5.0 NaN

Drop NaN Values

Drop rows with any NaN values


In [3]:
df >> call(pd.DataFrame.dropna)


Out[3]:
w x y z

In [4]:
# You can call method on the dataframe with '.method_name'
df >> call('.dropna')


Out[4]:
w x y z

Drop rows with all NaN values


In [5]:
df >> call('.dropna', how='all')


Out[5]:
w x y z
0 1.0 NaN NaN NaN
1 2.0 2.0 NaN NaN
3 4.0 4.0 NaN NaN
4 5.0 5.0 5.0 NaN

Drop rows with NaN values in the x column.


In [6]:
df >> call('.dropna', subset=['x'])


Out[6]:
w x y z
1 2.0 2.0 NaN NaN
3 4.0 4.0 NaN NaN
4 5.0 5.0 5.0 NaN

Drop and keep rows atleast 3 non-NaN values


In [7]:
df >> call('.dropna', thresh=3)


Out[7]:
w x y z
4 5.0 5.0 5.0 NaN

Drop columns with all NaN values


In [8]:
df >> call('.dropna', axis=1, how='all')


Out[8]:
w x y
0 1.0 NaN NaN
1 2.0 2.0 NaN
2 NaN NaN NaN
3 4.0 4.0 NaN
4 5.0 5.0 5.0

Drop columns with any NaN values in row 3.


In [9]:
df >> call('.dropna', axis=1, subset=[3])


Out[9]:
w x
0 1.0 NaN
1 2.0 2.0
2 NaN NaN
3 4.0 4.0
4 5.0 5.0

Fill NaN values

Replace all NaN values with -1.


In [10]:
df >> call(pd.DataFrame.fillna, -1)


Out[10]:
w x y z
0 1.0 -1.0 -1.0 -1.0
1 2.0 2.0 -1.0 -1.0
2 -1.0 -1.0 -1.0 -1.0
3 4.0 4.0 -1.0 -1.0
4 5.0 5.0 5.0 -1.0

In [11]:
df >> call('.fillna', -1)


Out[11]:
w x y z
0 1.0 -1.0 -1.0 -1.0
1 2.0 2.0 -1.0 -1.0
2 -1.0 -1.0 -1.0 -1.0
3 4.0 4.0 -1.0 -1.0
4 5.0 5.0 5.0 -1.0

Replace all NaN values with the first non-NaN value above in column


In [12]:
df >> call('.fillna', method='ffill')


Out[12]:
w x y z
0 1.0 NaN NaN NaN
1 2.0 2.0 NaN NaN
2 2.0 2.0 NaN NaN
3 4.0 4.0 NaN NaN
4 5.0 5.0 5.0 NaN

Replace all NaN values with the first non-NaN value below in column


In [13]:
df >> call('.fillna', method='bfill')


Out[13]:
w x y z
0 1.0 2.0 5.0 NaN
1 2.0 2.0 5.0 NaN
2 4.0 4.0 5.0 NaN
3 4.0 4.0 5.0 NaN
4 5.0 5.0 5.0 NaN

Replace atmost 2 NaN values with the first non-NaN value below in column


In [14]:
df >> call('.fillna', method='bfill', limit=2)


Out[14]:
w x y z
0 1.0 2.0 NaN NaN
1 2.0 2.0 NaN NaN
2 4.0 4.0 5.0 NaN
3 4.0 4.0 5.0 NaN
4 5.0 5.0 5.0 NaN

Replace all NaN values with the first non-NaN value to the left in the row


In [15]:
df >> call('.fillna', method='ffill', axis=1)


Out[15]:
w x y z
0 1.0 1.0 1.0 1.0
1 2.0 2.0 2.0 2.0
2 NaN NaN NaN NaN
3 4.0 4.0 4.0 4.0
4 5.0 5.0 5.0 5.0

Replace all NaN values with the first non-NaN value to the right in the row


In [16]:
df >> call('.fillna', method='bfill', axis=1)


Out[16]:
w x y z
0 1.0 NaN NaN NaN
1 2.0 2.0 NaN NaN
2 NaN NaN NaN NaN
3 4.0 4.0 NaN NaN
4 5.0 5.0 5.0 NaN