pandas knowledge points (processing missing data)

Posted by vaavi8r on Sun, 01 Dec 2019 11:16:39 +0100

pandas uses the floating-point value NaN to represent missing data in floating-point and non floating-point arrays:
In [14]: string_data = Series(['aardvark','artichoke',np.nan,'avocado'])
In [15]: string_data
Out[15]:
0     aardvark
1    artichoke
2          NaN
3      avocado
dtype: object
In [16]: string_data.isnull()
Out[16]:
0    False
1    False
2     True
3    False
dtype: bool

 

python's built-in None value is also treated as NA:
In [17]: string_data[0] = None
In [18]: string_data.isnull()
Out[18]:
0     True
1    False
2     True
3    False
dtype: bool

 

1. Filter out missing data
dropna is used to return a Series with only non empty data and index values:
In [20]: data = Series([1,NA,3.5,NA,7])
In [21]: data.dropna()
Out[21]:
0    1.0
2    3.5
4    7.0
dtype: float64

 

Through Boolean index, you can also:
In [22]: data[data.notnull()]
Out[22]:
0    1.0
2    3.5
4    7.0
dtype: float64

 

For DataFrame, dropna discards rows with missing values by default
In [23]: data = DataFrame([[1.,6.5,3.],[1.,NA,NA],[NA,NA,NA],[NA,6.5,3.]])
In [24]: cleaned = data.dropna()
In [25]: data
Out[25]:
     0    1    2
0  1.0  6.5  3.0
1  1.0  NaN  NaN
2  NaN  NaN  NaN
3  NaN  6.5  3.0
In [26]: cleaned
Out[26]:
     0    1    2
0  1.0  6.5  3.0

 

Incoming how="all" discard all NaN rows:
In [27]: data.dropna(how="all")
Out[27]:
     0    1    2
0  1.0  6.5  3.0
1  1.0  NaN  NaN
3  NaN  6.5  3.0

 

Discard columns with NaN:
In [28]: data[4] = NA
In [29]: data
Out[29]:
     0    1    2   4
0  1.0  6.5  3.0 NaN
1  1.0  NaN  NaN NaN
2  NaN  NaN  NaN NaN
3  NaN  6.5  3.0 NaN
In [30]: data.dropna(axis=1,how="all")
Out[30]:
     0    1    2
0  1.0  6.5  3.0
1  1.0  NaN  NaN
2  NaN  NaN  NaN
3  NaN  6.5  3.0

 

thresh can choose how many useful rows to filter
In [41]: df
Out[41]:
          0         1         2
0 -0.184676       NaN       NaN
1  0.565214       NaN       NaN
2  0.440203       NaN       NaN
3  0.188283       NaN  0.146847
4  1.696903       NaN  0.554640
5 -1.287915  0.139527 -0.494558
6  0.854922  0.299511  0.773247
In [42]: df.dropna(thresh=2)  # thresh=2 Indicates that there are at least two non empty data
Out[42]:
          0         1         2
3  0.188283       NaN  0.146847
4  1.696903       NaN  0.554640
5 -1.287915  0.139527 -0.494558
6  0.854922  0.299511  0.773247
In [43]: df.dropna(thresh=1)
Out[43]:
          0         1         2
0 -0.184676       NaN       NaN
1  0.565214       NaN       NaN
2  0.440203       NaN       NaN
3  0.188283       NaN  0.146847
4  1.696903       NaN  0.554640
5 -1.287915  0.139527 -0.494558
6  0.854922  0.299511  0.773247

 

2. Fill in missing data
fillna is the main method to fill in the default data:
In [9]: df.fillna(0)
Out[9]:
          0         1         2
0  0.863556  0.000000  0.000000
1 -0.099558  0.000000  0.000000
2 -0.605804  0.000000  0.000000
3 -0.934688  0.000000 -1.198976
4  0.741383  0.000000  0.229845
5 -1.415495  0.511485 -0.086808
6 -0.748325  0.437964 -2.458319

 

Call fillna through the dictionary to fill in different values for different columns:
In [11]: df.fillna({1:0.5,2:-1})
Out[11]:
          0         1         2
0  0.863556  0.500000 -1.000000
1 -0.099558  0.500000 -1.000000
2 -0.605804  0.500000 -1.000000
3 -0.934688  0.500000 -1.198976
4  0.741383  0.500000  0.229845
5 -1.415495  0.511485 -0.086808
6 -0.748325  0.437964 -2.458319

 

Topics: Python