第一步当然是导入相应的库啦!
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