引入三剑客
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
np.nan + 9 结果为: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
用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 |
isnull()
notnull()
dropna()
: 过滤丢失数据fillna()
: 填充丢失数据(1)判断函数
isnull()
notnull()
df1.isnull() # 返回一个同样形状的DataFrame 如果是空这个位置就是True 否则就是False
a | b | c | d | e | |
---|---|---|---|---|---|
0 | False | False | False | False | False |
1 | False | True | False | False | False |
2 | False | False | True | False | False |
3 | False | False | False | False | False |
4 | False | False | False | False | False |
df1.notnull() # 不是空值返回True 是空值就是False
a | b | c | d | e | |
---|---|---|---|---|---|
0 | True | True | True | True | True |
1 | True | False | True | True | True |
2 | True | True | False | True | True |
3 | True | True | True | True | True |
4 | True | True | True | True | True |
配合any使用,可以查看每一行是否存在空值 可以控制axis来改变查看方向
df1.isnull().any() # 默认看每一列 只要有True就是True
结果为:
a False
b True
c True
d False
e False
dtype: bool
如果想看每一行的中 有没有空值 可以改变axis
df1.isnull().any(axis=0) # axis 默认是 0 是竖直方向
df1.isnull().any(axis=1) # 通过这种方式 可以找到有空值的样本
结果为:
0 False
1 True
2 True
3 False
4 False
dtype: bool
(2) 过滤函数
dropna()
可以选择过滤的是行还是列(默认为行)
df1.dropna() # 如果有空值 就把整行都干掉
df1.dropna(axis=0) # 默认是对行进行处理
a | b | c | d | e | |
---|---|---|---|---|---|
0 | 18 | 18.0 | 4.0 | 10 | 6 |
3 | 2 | 18.0 | 10.0 | 16 | 14 |
4 | 14 | 13.0 | 2.0 | 10 | 14 |
# 如果不确定axis到底是横还是竖 可以自己先创建一个假数据 试一试
df1.dropna(axis=1) # 对有空值的列进行处理
a | d | e | |
---|---|---|---|
0 | 18 | 10 | 6 |
1 | 6 | 8 | 4 |
2 | 5 | 2 | 2 |
3 | 2 | 16 | 14 |
4 | 14 | 10 | 14 |
也可以选择过滤的方式 how = ‘all’
df1.dropna(how="any") # 只要有空值 就干掉
a | b | c | d | e | |
---|---|---|---|---|---|
0 | 18 | 18.0 | 4.0 | 10 | 6 |
3 | 2 | 18.0 | 10.0 | 16 | 14 |
4 | 14 | 13.0 | 2.0 | 10 | 14 |
df1.dropna(how="all") # 这一行所有的值都是空值 才干掉
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 |
df1.iloc[2] = np.nan
df1
a | b | c | d | e | |
---|---|---|---|---|---|
0 | 18.0 | 18.0 | 4.0 | 10.0 | 6.0 |
1 | 6.0 | NaN | 8.0 | 8.0 | 4.0 |
2 | NaN | NaN | NaN | NaN | NaN |
3 | 2.0 | 18.0 | 10.0 | 16.0 | 14.0 |
4 | 14.0 | 13.0 | 2.0 | 10.0 | 14.0: |
df1.dropna(how="all")
a | b | c | d | e | |
---|---|---|---|---|---|
0 | 18.0 | 18.0 | 4.0 | 10.0 | 6.0 |
1 | 6.0 | NaN | 8.0 | 8.0 | 4.0 |
3 | 2.0 | 18.0 | 10.0 | 16.0 | 14.0 |
4 | 14.0 | 13.0 | 2.0 | 10.0 | 14.0 |
(3) 填充函数 Series/DataFrame
fillna()
可以指定value
df1.fillna(value=0) # 遇到空值 可以设置成我们制定的值
a | b | c | d | e | |
---|---|---|---|---|---|
0 | 18.0 | 18.0 | 4.0 | 10.0 | 6.0 |
1 | 6.0 | 0.0 | 8.0 | 8.0 | 4.0 |
2 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
3 | 2.0 | 18.0 | 10.0 | 16.0 | 14.0 |
4 | 14.0 | 13.0 | 2.0 | 10.0 | 14.0 |
df1.fillna(value=10)
a | b | c | d | e | |
---|---|---|---|---|---|
0 | 18.0 | 18.0 | 4.0 | 10.0 | 6.0 |
1 | 6.0 | 10.0 | 8.0 | 8.0 | 4.0 |
2 | 10.0 | 10.0 | 10.0 | 10.0 | 10.0 |
3 | 2.0 | 18.0 | 10.0 | 16.0 | 14.0 |
4 | 14.0 | 13.0 | 2.0 | 10.0 | 14.0 |
也可以选择从前面找值来填充还是从后面找值来填充
pad / ffill 从前面找值来填充
backfill/ bfill 从后面找值来填充
df1.fillna(method="ffill")
a | b | c | d | e | |
---|---|---|---|---|---|
0 | 18.0 | 18.0 | 4.0 | 10.0 | 6.0 |
1 | 6.0 | 18.0 | 8.0 | 8.0 | 4.0 |
2 | 6.0 | 18.0 | 8.0 | 8.0 | 4.0 |
3 | 2.0 | 18.0 | 10.0 | 16.0 | 14.0 |
4 | 14.0 | 13.0 | 2.0 | 10.0 | 14.0 |
df1.fillna(method="bfill")
a | b | c | d | e | |
---|---|---|---|---|---|
0 | 18.0 | 18.0 | 4.0 | 10.0 | 6.0 |
1 | 6.0 | 18.0 | 8.0 | 8.0 | 4.0 |
2 | 2.0 | 18.0 | 10.0 | 16.0 | 14.0 |
3 | 2.0 | 18.0 | 10.0 | 16.0 | 14.0 |
4 | 14.0 | 13.0 | 2.0 | 10.0 | 14.0 |
虽然填充了值 但并不影响df1原先的值,
a | b | c | d | e | |
---|---|---|---|---|---|
0 | 18.0 | 18.0 | 4.0 | 10.0 | 6.0 |
1 | 6.0 | NaN | 8.0 | 8.0 | 4.0 |
2 | NaN | NaN | NaN | NaN | NaN |
3 | 2.0 | 18.0 | 10.0 | 16.0 | 14.0 |
4 | 14.0 | 13.0 | 2.0 | 10.0 | 14.0 |
还可以指定是在寻找值时候的轴线
df1.fillna(method="ffill",axis=0) # axis 默认是0 竖直找 前面已做过
df1.fillna(method="ffill",axis=1) # axis 1 水平找
a | b | c | d | e | |
---|---|---|---|---|---|
0 | 18.0 | 18.0 | 4.0 | 10.0 | 6.0 |
1 | 6.0 | 6.0 | 8.0 | 8.0 | 4.0 |
2 | NaN | NaN | NaN | NaN | NaN |
3 | 2.0 | 18.0 | 10.0 | 16.0 | 14.0 |
4 | 14.0 | 13.0 | 2.0 | 10.0 | 14.0 |
还可以限定最多往前(往后)填充几个NaN
df1["c"].iloc[1]=np.nan
df1
a | b | c | d | e | |
---|---|---|---|---|---|
0 | 18.0 | 18.0 | 4.0 | 10.0 | 6.0 |
1 | 6.0 | NaN | NaN | 8.0 | 4.0 |
2 | NaN | NaN | NaN | NaN | NaN |
3 | 2.0 | 18.0 | 10.0 | 16.0 | 14.0 |
4 | 14.0 | 13.0 | 2.0 | 10.0 | 14.0 |
df1.fillna(method="ffill",limit=2) # 限制往前找几个
a | b | c | d | e | |
---|---|---|---|---|---|
0 | 18.0 | 18.0 | 4.0 | 10.0 | 6.0 |
1 | 6.0 | 18.0 | 4.0 | 8.0 | 4.0 |
2 | 6.0 | 18.0 | 4.0 | 8.0 | 4.0 |
3 | 2.0 | 18.0 | 10.0 | 16.0 | 14.0 |
4 | 14.0 | 13.0 | 2.0 | 10.0 | 14.0 |
对于DataFrame来说,还要选择填充的轴axis。记住,对于DataFrame来说:
使用limit来限定往后找几个
axis 指定是横着找还是竖着找
method 指定找前面还是找后面
注意:value参数是不能跟method参数共用的
df.fillna(method='bfill',axis=1,limit=1)
a | b | c | d | e | |
---|---|---|---|---|---|
0 | 18.0 | 18.0 | 4.0 | 10.0 | 6.0 |
1 | 6.0 | NaN | 8.0 | 8.0 | 4.0 |
2 | NaN | NaN | NaN | NaN | NaN |
3 | 2.0 | 18.0 | 10.0 | 16.0 | 14.0 |
4 | 14.0 | 13.0 | 2.0 | 10.0 | 14.0 |
============================================
练习7:
============================================