Pandas 数据清洗

前言:

数据的质量直接关乎最后数据分析出来的结果。

在进行数据分析前,我们必须对数据进行清洗。

如果数据较少,我们可以对缺失值,异常值进行拉格朗日插值法进行插值处理。

在这篇博客里,因为数据样本较充足,我们直接对少量的异常值进行简单粗暴也是最有效的删除。


先上图看一下数据(注:因为博客上传不了附件,如有需要样本数据自己进行实测的可以留言索要)


上图为要进行清洗的数据的一部分。

这里,我们首先用Pandas直接读入数据变成DataFrame.(Pandas库不懂的同学要去看看《Python数据分析》)

import pandas as pd 
import numpy as np

# 读入数据
data=pd.DataFrame(pd.read_excel('000.xlsx',index=False))
print(data)

打印出数据,打印出原始数据如下图所示:



目标:

这里,我们可以看到,日期列没什么问题,时间列(hour)出现235小时明显不符,一天时间只能落在0-24。气压(pressure)超过1500不正常。sea_pressure有存在空值现象。wind_direction也存在值=999017的异常数据。我们要做的是对存在异常值的记录整行进行删除,最后写入数据。


我们首先利用describe()函数看样本数据的大概情况。

print(data.describe())



count非空数据总和。可以看到 sea_pressure 的非空数据总和为857,rel_humidity为861,证明这两列数据分别存在5,1行空值(缺失值)

mean均值

std标准差,值越大表示此行数据越离散。存在异常值概率越大。

min,max:最小值最大值。时间hour列最大值为235明显为异常值。


开始数据清洗

1 填充缺失值空格,方便下面对缺失值行进行处理。

# 填充缺失值
data=data.fillna('missing')

我们可以看到,缺失值被填充成‘missing’,填充成什么值不重要,只要不予数据里的其它值一样就行。



2  逐行扫描数据,只要此行存在一个异常值。对此行进行删除。

这里,any([])函数如若里面一个为真,则返回True.即逐行扫描,发现‘missing’存在此行中,或此行时间不落在0-24之间,或气压rpessure大于1500,或风向不落在0-360度之间,或风速大于10级,或precipitation降雨量大于10,则此行数据为异常数据进行删除。

for i in range(data.index.max()):
	if any([
		'missing' in data.loc[i,:].values,
		data.loc[i,'hour'] not in range(25),
		data.loc[i,'pressure']>1500,
		data.loc[i,'wind_direction']<0 or data.loc[i,'wind_direction']>360,
		data.loc[i,'wind_speed']>10,
		data.loc[i,'precipitation']>10
		]):

		print('已删除存在异常值 %s 行数据'%i)
		data.drop([i],inplace=True)

运行结果:

3显示处理后数据信息:

 

print(data)
print(data.describe())


4最后,查看无异常后保存清洗后的数据。

data.to_csv('clean.csv')



全部代码:

import pandas as pd 
import numpy as np

# 读入数据
data=pd.DataFrame(pd.read_excel('000.xlsx',index=False))
print('原始数据\n',data)
print('----------------------------基本信息  describe()-----------------------------')
print(data.describe())
# print(data.std(),data.min(),data.max())

'''
print('\n-----------------------极差变异系数四分位间距-------------------------')
statistics = data.describe() #保存基本统计量
statistics.loc['range'] = statistics.loc['max']-statistics.loc['min'] #极差
statistics.loc['var'] = statistics.loc['std']/statistics.loc['mean'] #变异系数
statistics.loc['dis'] = statistics.loc['75%']-statistics.loc['25%'] #四分位数间距
# print(statistics)
'''



print('-------------------------------数据清洗-------------------------------')
# 填充缺失值
data=data.fillna('missing')
for i in range(data.index.max()):
	if any([
		'missing' in data.loc[i,:].values,
		data.loc[i,'hour'] not in range(25),
		data.loc[i,'pressure']>1500,
		data.loc[i,'wind_direction
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值