Python数据清洗之缺失值与异常值处理(五)

Python数据清洗之缺失值处理(五)


处理缺失值方法有三类:

  1. 删除缺失值
  2. 填充默认值
  3. 数据插补
    原始数据:
    |  |  ||--|--||  |  |

删除缺失值

使用dropna()删除数据中的空值。

import pandas as pd
import os
input_file = os.getcwd() + '\data\catering_sale.xls'
output_file = os.getcwd() + '\data\sales.xls'
data = pd.read_excel(input_file,encoding = 'utf-8')
print(data.dropna())

运行结果:

          日期      销量
0  2015-03-01    51.0
1  2015-02-28  2618.2
2  2015-02-27  2608.4
3  2015-02-26  2651.9
4  2015-02-25  3442.1
5  2015-02-24  3393.1
6  2015-02-23  3136.6
7  2015-02-22  3744.1
8  2015-02-21  6607.4
9  2015-02-20  4060.3
10 2015-02-19  3614.7
11 2015-02-18  3295.5
12 2015-02-16  2332.1
13 2015-02-15  2699.3
15 2015-02-13  3036.8
16 2015-02-12   865.0
17 2015-02-11  3014.3
18 2015-02-10  2742.8

已经删除缺失值。

填充默认值

使用fillna()函数填充一个默认数据。

import pandas as pd
import os
input_file = os.getcwd() + '\data\catering_sale.xls'
output_file = os.getcwd() + '\data\sales.xls'
data = pd.read_excel(input_file,encoding = 'utf-8')
print(data.fillna(0))

运行结果:

           日期      销量
0  2015-03-01    51.0
1  2015-02-28  2618.2
2  2015-02-27  2608.4
3  2015-02-26  2651.9
4  2015-02-25  3442.1
5  2015-02-24  3393.1
6  2015-02-23  3136.6
7  2015-02-22  3744.1
8  2015-02-21  6607.4
9  2015-02-20  4060.3
10 2015-02-19  3614.7
11 2015-02-18  3295.5
12 2015-02-16  2332.1
13 2015-02-15  2699.3
14 2015-02-14     0.0
15 2015-02-13  3036.8
16 2015-02-12   865.0
17 2015-02-11  3014.3
18 2015-02-10  2742.8

已经将缺失值填充为0.

数据插补

一般采用插值法,包含拉格朗日插值法、牛顿插值、Hermite插值、分段插值、样条插值等。在Python的Scipy库中,只提供了拉格朗日插值的函数 ,因此我们只重点讲解拉格朗日插值方法(学编程数学一定要学好==)。

import pandas as pd
from scipy.interpolate import lagrange
import os
input_file = os.getcwd() + '\data\catering_sale.xls'
output_file = os.getcwd() + '\data\sales.xls' #输出数据路径
data = pd.read_excel(input_file,encoding = 'utf-8') #读入数据
data[u'销量'][(data[u'销量']<400) | (data[u'销量']>5000)] = None #过滤异常值,将其变为空值
#s为列向量,n为被插值位置,k为取前后的数据个数
def ployinter(s,n,k=5):
	y = s[list(range(n-k,n)) + list(range(n+1,n+1+k))]
	y = y[y.notnull()] #剔除空值
	return lagrange(y.index,list(y))(n)
#逐个元素判断是否需要插值
for i in data.columns:
	for j in range(len(data)):
		if(data[i].isnull())[j]:
			data[i][j] = ployinter(data[i],j)
print(data[u'销量'])
data.to_excel(output_file)

运行结果:

1     2618.200000
2     2608.400000
3     2651.900000
4     3442.100000
5     3393.100000
6     3136.600000
7     3744.100000
8     4275.254762
9     4060.300000
10    3614.700000
11    3295.500000
12    2332.100000
13    2699.300000
14    3831.099225
15    3036.800000
16     865.000000
17    3014.300000
18    2742.800000
Name: 销量, dtype: float64

空值处已经插值。

猜你喜欢

转载自blog.csdn.net/weixin_39549161/article/details/86319946