第一步当然是导入相应的库啦!
import numpy as np
import pandas as pd
from pandas import DataFrame
好了,让我们开始这次清洗活动吧。GOGOGO!!!
1 pandas处理空值
首先我们先定义一个名叫df的二维数组,并把它的第3行第4列变为none,这在我们平常的数据中会时常出现,还有把它的第3行第4列变为np.nan
ps:后面附加的内容会介绍none和np.nan,最主要的区别是一个有自己的类型,而另外一个没有
df = DataFrame(data = np.random.randint(1,100,(4,5)))
df.iloc[2,3] = None
df.iloc[3,4] = np.nan
df
在这里我们就能看到df实际上是一张表,跟excel表格差不多,里面有我们刚才存进去的none和np.nan都变成了NaN值,意味着都为空
0 | 1 | 2 | 3 | 4 | |
0 | 85 | 63 | 35 | 97.0 | 32.0 |
1 | 52 | 91 | 30 | 6.0 | 40.0 |
2 | 33 | 63 | 96 | NaN | 9.0 |
3 | 33 | 35 | 68 | 81.0 | NaN |
1.1 删除所在的空行
-----方式1-------了解
# 使用notnull函数检测是否为非空
# 使用all某一行或者列全为True则返回True
df.notnull().all(axis=1)
0 True
1 True
2 False
3 False
dtype: bool
通过上面的结果可以很清楚地看到第3,4行存在空值
# loc函数根据指定的布尔值为True来提取数据所在的行
df.loc[df.notnull().all(axis=1)]
这样我们就去除了空行
0 | 1 | 2 | 3 | 4 | |
0 | 85 | 63 | 35 | 97.0 | 32.0 |
1 | 52 | 91 | 30 | 6.0 | 40.0 |
-----方式2-------了解
# 使用isnull:检测是否为空
# any:某一行或者列有一个True则返回True
df.loc[-df.isnull().any(axis=1)]
0 | 1 | 2 | 3 | 4 | |
0 | 85 | 63 | 35 | 97.0 | 32.0 |
1 | 52 | 91 | 30 | 6.0 | 40.0 |
-----方式3------- 推荐
#dropna函数:默认删除dataframe中所有带空值的行
df.dropna(axis = 0)
0 | 1 | 2 | 3 | 4 | |
0 | 85 | 63 | 35 | 97.0 | 32.0 |
1 | 52 | 91 | 30 | 6.0 | 40.0 |
1.2 将空值填充(近值)
使用fillna函数来填充
设置不同的参数实现不同方式的冲突
#向前填充
df.fillna(method = 'ffill',axis = 0)
#向后填充
df.fillna(method = 'bfill',axis = 0)
#向前后填充
df.fillna(method = 'bfill',axis = 0).fillna(method = 'ffill',axis = 0)
0 | 1 | 2 | 3 | 4 | |
0 | 85 | 63 | 35 | 97.0 | 32.0 |
1 | 52 | 91 | 30 | 6.0 | 40.0 |
2 | 33 | 63 | 96 | 6.0 | 9.0 |
3 | 33 | 35 | 68 | 81.0 | 9.0 |
1.3 现实应用优先级
删除> 填充,但是要看实际的应用场景来判断
2 pandas处理重复数据
跟前面一样,生成一个二维数组da,将第1,2行所有数值设置为重复值6
da = DataFrame(data = np.random.randint(1,100,(4,5)))
da.iloc[1] = 6
da.iloc[2] = 6
da
0 | 1 | 2 | 3 | 4 | |
0 | 97 | 86 | 8 | 96 | 44 |
1 | 6 | 6 | 6 | 6 | 6 |
2 | 6 | 6 | 6 | 6 | 6 |
3 | 60 | 79 | 39 | 60 | 83 |
解决方法:
使用drop_duplicates函数来删除重复的行,last: 删除重复项,除了最后一次出现,也可以使用first来保存第一次出现的数据
da.drop_duplicates(keep='last')
0 | 1 | 2 | 3 | 4 | |
0 | 97 | 86 | 8 | 96 | 44 |
2 | 6 | 6 | 6 | 6 | 6 |
3 | 60 | 79 | 39 | 60 | 83 |
3 pandas处理异常数据
异常值的出现可能由于数据源或者操作不当引起的,下面是一个小例子来说明:
规定:生成一个二维数组dc,dc数组的c列的值大于a列和b列的值的一半则为异常数据
dc = DataFrame(data = np.random.randint(1,100,(100,3)),columns=['a','b','c'])
dc
a | b | c | |
0 | 15 | 78 | 57 |
1 | 67 | 11 | 49 |
2 | 86 | 3 | 63 |
3 | 23 | 74 | 87 |
4 | 81 | 21 | 66 |
... | ... | ... | ... |
95 | 49 | 33 | 1 |
96 | 65 | 58 | 75 |
97 | 96 | 66 | 52 |
98 | 95 | 53 | 46 |
99 | 15 | 2 | 26 |
100 rows × 3 columns
判定方法:
1.先算出a列和b列的平均值twice_std
2.将算出的值与c列的值比较,如果为True则使用loc函数取出来
# 判定异常值
twice_std = (dc['a'] + dc['b'])/2
dc['c'] > twice_std
dc.loc[dc['c'] > twice_std]
a | b | c | |
0 | 15 | 78 | 57 |
1 | 67 | 11 | 49 |
2 | 86 | 3 | 63 |
3 | 23 | 74 | 87 |
4 | 81 | 21 | 66 |
13 | 19 | 2 | 64 |
14 | 47 | 24 | 97 |
16 | 26 | 30 | 96 |
18 | 29 | 95 | 66 |
19 | 35 | 31 | 57 |
22 | 80 | 75 | 93 |
24 | 12 | 13 | 52 |
25 | 63 | 14 | 94 |
26 | 64 | 56 | 99 |
28 | 73 | 52 | 82 |
29 | 10 | 86 | 68 |
30 | 23 | 7 | 86 |
31 | 30 | 92 | 87 |
34 | 5 | 19 | 56 |
35 | 7 | 13 | 48 |
37 | 16 | 3 | 60 |
39 | 64 | 28 | 56 |
43 | 80 | 42 | 62 |
46 | 88 | 48 | 92 |
49 | 1 | 37 | 36 |
55 | 19 | 57 | 79 |
56 | 66 | 71 | 94 |
57 | 16 | 30 | 35 |
58 | 77 | 4 | 90 |
65 | 15 | 26 | 90 |
69 | 24 | 58 | 61 |
72 | 29 | 25 | 34 |
74 | 35 | 24 | 67 |
75 | 74 | 6 | 92 |
76 | 72 | 56 | 66 |
77 | 46 | 67 | 76 |
80 | 59 | 24 | 83 |
85 | 22 | 4 | 83 |
89 | 29 | 4 | 98 |
91 | 16 | 26 | 52 |
96 | 65 | 58 | 75 |
99 | 15 | 2 | 26 |
通过上面的表格可以看到行数明显减少了
4.附加内容:none和np.nan的区别
type(None) # 不可以运算
NoneType
type(np.NAN) #可以运算
float