Pandas数据清洗

数据清洗主要是对不符合要求的数据进行处理,比如删除那行数据,进行自定义填充等等。

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->allFalse表示其对应的行中存在空值

 

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的行,25被删除

 

对空值进行填充

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')

上一篇:股票数据分析案例

下一篇:Scrapy 发送POST请求