前言

上一次我们已经学习了Pandas的基础知识,接下来让我们一起继续探索Pandas的魅力吧~ - ~
第一步当然是导入相应的库啦!
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
好了,今天pandas的数据清洗先学到这里啦,希望对你的实际使用中有所帮助,记得关注小编继续学习下一篇我们andas相对高级的用法,每天进步一点点。喜欢这篇文章记得点赞评论呀!!!
另附上

numpy学习笔记:

https://blog.csdn.net/weixin_45127640/article/details/106696613

pandas基础知识

https://blog.csdn.net/weixin_45127640/article/details/106988744

有需求的同学可以继续学习呀!冲鸭!!!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐