数据清洗主要是对不符合要求的数据进行处理,比如删除那行数据,进行自定义填充等等。
import numpy as np
import pandas as pd
from pandas import DataFrame,Series
pandas中有两种数据丢失
-None
-np.nan(NaN)
其中None进行运算时,比如None+1会报错,而np.nan+1则会返回Nan
object类型在运算时比float类型运算更耗时(这就是为什么进行数据清洗的原因之下),下面看下结果比较下就会明白了
%timeitnp.arange(1000,dtype=object).sum()
输出:
85.4 µs ± 6.15 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeitnp.arange(1000,dtype=float).sum()
输出:
6.45 µs ± 84.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
两者耗时不在一个数量级
下面人为的产生一些Nan
df=DataFrame(np.random.randint(0,100,size=(8,6)))
df.iloc[2,3]=np.nan
df.iloc[5,5]=None
df.iloc[5,3]=np.nan
df.iloc[7,2]=np.nan
得到下面的结果
在pandas中处理空值的操作主要有:
-isnull # 为空返回True
-notnull # 非空返回True
-any # 任一
-all # 所有
-dropna # 删除Nan
-fillna # 填充Nan
df.isnull()#判断哪些元素为空值,那些Nan的返回为True
判断哪些行中存在空值:
df.isnull().any(axis=1)#any只要有Nan的行,就会返回True
0 False
1 False
2 True
3 False
4 False
5 True
6 False
7 True
dtype: bool
判断是否都是非空
df.notnull().all(axis=1)#all只要有一个Nan就会返回False
0 True
1 True
2 False
3 True
4 True
5 False
6 True
7 False
dtype: bool
#返回没有Nan的行,通过loc来取
df.loc[df.notnull().all(axis=1)]
0 |
1 |
2 |
3 |
4 |
5 |
|
0 |
0 |
81 |
60.0 |
92.0 |
99 |
1.0 |
1 |
62 |
67 |
98.0 |
41.0 |
43 |
80.0 |
3 |
63 |
30 |
63.0 |
22.0 |
99 |
24.0 |
4 |
97 |
60 |
68.0 |
85.0 |
24 |
35.0 |
6 |
65 |
0 |
4.0 |
74.0 |
35 |
83.0 |
通过上面的例子可以总结出:
-isnull->any:true表示其对应的行中存在空值
-notnull->all:False表示其对应的行中存在空值
pandas内置的处理空值的方法:
#直接使用dropna函数过滤空值对应的行数据
df.dropna(axis=0)
0 |
1 |
2 |
3 |
4 |
5 |
|
0 |
0 |
81 |
60.0 |
92.0 |
99 |
1.0 |
1 |
62 |
67 |
98.0 |
41.0 |
43 |
80.0 |
3 |
63 |
30 |
63.0 |
22.0 |
99 |
24.0 |
4 |
97 |
60 |
68.0 |
85.0 |
24 |
35.0 |
6 |
65 |
0 |
4.0 |
74.0 |
35 |
83.0 |
存在Nan的行,2,5被删除
对空值进行填充
df.fillna(method='ffill',axis=1)#axis轴向,1表上横向,method=ffill(向前),bfill(向后填充)
处理重复数据
df=DataFrame(data=np.random.randint(0,100,size=(10,8)))
df.iloc[1]=[1,1,1,1,1,1,1,1]
df.iloc[3]=[1,1,1,1,1,1,1,1]
df.iloc[5]=[1,1,1,1,1,1,1,1]
df.iloc[7]=[1,1,1,1,1,1,1,1]
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
0 |
85 |
27 |
59 |
81 |
14 |
65 |
86 |
17 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
65 |
2 |
69 |
44 |
99 |
12 |
75 |
37 |
3 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
4 |
47 |
63 |
62 |
9 |
77 |
36 |
15 |
90 |
5 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
6 |
7 |
38 |
2 |
5 |
93 |
86 |
4 |
92 |
7 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
8 |
22 |
12 |
45 |
93 |
29 |
42 |
96 |
59 |
9 |
11 |
10 |
49 |
60 |
45 |
58 |
23 |
53 |
#删除重复的行,可以选择保留first,last,即保留第一个,或者最后一个
df.drop_duplicates(keep='last')