1. NaN
- Not a Number,“不是一个数字”,数值类型的缺失值。
- NaN可以看做一个数据病毒,它会将与它接触过的数据同化为NaN。
- NaN是一种特殊的浮点数,不能完全等价于其他数据类型。
但对Pandas来说,None和NaN“基本”等价:
data = pd.Series([1, None, np.nan])
data
0 1.0
1 NaN
2 NaN
dtype: float64
2. 发现
返回布尔掩码。
# 数据准备
np.random.seed(23)
data = pd.DataFrame(np.random.randint(0,100,(4,5)))
data[data<50] = np.nan
data
|
0 |
1 |
2 |
3 |
4 |
0 |
83 |
NaN |
73.0 |
54.0 |
NaN |
1 |
76 |
91.0 |
NaN |
90.0 |
NaN |
2 |
51 |
NaN |
NaN |
NaN |
NaN |
3 |
66 |
75.0 |
85.0 |
69.0 |
64.0 |
data.isnull()
|
0 |
1 |
2 |
3 |
4 |
0 |
False |
True |
False |
False |
True |
1 |
False |
False |
True |
False |
True |
2 |
False |
True |
True |
True |
True |
3 |
False |
False |
False |
False |
False |
data.notnull()
|
0 |
1 |
2 |
3 |
4 |
0 |
True |
False |
True |
True |
False |
1 |
True |
True |
False |
True |
False |
2 |
True |
False |
False |
False |
False |
3 |
True |
True |
True |
True |
True |
3. 剔除
.dropna()
,对Series很简单,但对DataFrame需要考虑:
- 删行还是删列?
- 有一个缺失值就删整行(列),还是全部都是缺失值才删整行(列)?
默认情况:
- 剔除整行数据,即
axis='row'
是默认的;
- 含有一个缺失值就删,即
how='any'
是默认的;
可以自制:
axix=columns
,剔除整列数据;
how='all'
,所有数据都是缺失值才删除;
thresh=3
,设置允许的非缺失值的最小数量,如果非缺失值太少,才删——介于“有一个就删”和“全是才删”之间;
4. 填充
.fillna()
,返回副本。
# 数据准备
np.random.seed(0)
data = pd.DataFrame(np.random.randint(0,100,(4,5)))
data = data[data>50]
data
|
0 |
1 |
2 |
3 |
4 |
0 |
NaN |
NaN |
64.0 |
67.0 |
67 |
1 |
NaN |
83.0 |
NaN |
NaN |
87 |
2 |
70.0 |
88.0 |
88.0 |
NaN |
58 |
3 |
65.0 |
NaN |
87.0 |
NaN |
88 |
# 用特定值填充缺失值
data.fillna(-1)
|
0 |
1 |
2 |
3 |
4 |
0 |
-1.0 |
-1.0 |
64.0 |
67.0 |
67 |
1 |
-1.0 |
83.0 |
-1.0 |
-1.0 |
87 |
2 |
70.0 |
88.0 |
88.0 |
-1.0 |
58 |
3 |
65.0 |
-1.0 |
87.0 |
-1.0 |
88 |
# 设置method参数为ffill,代表forword-fill
# 表示用该NaN"之前的"有效值填充,默认情况是按”列“,即“上面的前面”,此时默认参数axis=0
# 注意,从前往后填充,若前面没有值,则还为NaN;若有值但为NaN,再往前推一个,直到没有值或找到有效值
data.fillna(method='ffill')
|
0 |
1 |
2 |
3 |
4 |
0 |
NaN |
NaN |
64.0 |
67.0 |
67 |
1 |
NaN |
83.0 |
64.0 |
67.0 |
87 |
2 |
70.0 |
88.0 |
88.0 |
67.0 |
58 |
3 |
65.0 |
88.0 |
87.0 |
67.0 |
88 |
# 设置axis=1按“行“:
data.fillna(method='ffill', axis=1)
|
0 |
1 |
2 |
3 |
4 |
0 |
NaN |
NaN |
64.0 |
67.0 |
67.0 |
1 |
NaN |
83.0 |
83.0 |
83.0 |
87.0 |
2 |
70.0 |
88.0 |
88.0 |
88.0 |
58.0 |
3 |
65.0 |
65.0 |
87.0 |
87.0 |
88.0 |