引入三剑客
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
处理丢失数据
1.有两种丢失数据:
- None: Python自带的数据类型 不能参与到任何计算中
- np.nan(NaN): float类型 能参与计算,但结果总是NaN
np.nan + 9 结果为:nan
2. np.nan(NaN)
数组直接运算会得到nan,但可以使用np.nan*()函数来计算nan,此时视nan为0。
ndarr1 = np.array([1,2,3,np.nan])
ndarr1
np.sum(ndarr1)
结果为:
nan
np.nansum(ndarr1) # nan*()遇到nan会把nan当作0来处理
结果为:
6.0
Series和DataForm可以直接处理nan
s1 = Series([1,2,3,np.nan])
s1.sum() #Series 直接可以处理nan的情况
结果为:6.0
df1 = DataFrame([1,2,3,np.nan])
df1.sum() #DataFrame 直接可以处理nan的情况
结果为:
0 6.0
dtype: float64
3. pandas中的None与NaN
1) pandas中None与np.nan都视作np.nan
用randint创建一个5*5的DataFrame作为例子
Series 和 DataForm 如果遇到None 就会把 None 转换成 numpy.nan
df1 = DataFrame(data=np.random.randint(0,20,size=(5,5)),columns=list("abcde"))
df1
a | b | c | d | e | |
---|---|---|---|---|---|
0 | 18 | 18 | 4 | 10 | 6 |
1 | 6 | 12 | 8 | 8 | 4 |
2 | 5 | 15 | 18 | 2 | 2 |
3 | 2 | 18 | 10 | 16 | 14 |
4 | 14 | 13 | 2 | 10 | 14 |
使用DataFrame行索引与列索引修改一下DataFrame数据(弄出来一些None和NaN)
df1["b"][1] = None
df1["c"].iloc[2] = None
df1.iloc[2].loc["d"] = np.nan # 自己显式地去设置nan不太好 大家平时不要这么做
df1
a | b | c | d | e | |
---|---|---|---|---|---|
0 | 18 | 18.0 | 4.0 | 10 | 6 |
1 | 6 | NaN | 8.0 | 8 | 4 |
2 | 5 | 15.0 | NaN | 2 | 2 |
3 | 2 | 18.0 | 10.0 | 16 | 14 |
4 | 14 | 13.0 | 2.0 | 10 | 14 |
2) pandas中None与np.nan的操作
isnull()
notnull()
dropna()
: 过滤丢失数据fillna()
: 填充丢失数据
(1)判断函数
isnull()
notnull()