学习笔记(01):Python数据清洗实战-数据离散化

立即学习:https://edu.csdn.net/course/play/26990/361136?utm_source=blogtoedu

数据离散化

但是异常数据用盖帽法处理后,df[['Price','Price_new']].describe()的结果和老师实战的结果是一样的,但是箱线图上面还有很多点。不知道什么原因?详见下图:

箱线图异常

代码如下:

import numpy as np
import pandas as pd
import os
os.chdir(r'C:/Users/wu_dh/Downloads/数据清洗课程材料/代码和数据')
df = pd.read_csv('MotorcycleData.csv',encoding = 'gbk',na_values='Na')
# In[ ]:
# 自定义数据格式转换函数
def f(x):
    if '$' in str(x):
        x = str(x).strip('$')
        x = str(x).replace(',','')
    else:
        x = str(x).replace(',','')
    return float(x)
# In[ ]:
df['Price'] =  df['Price'] .apply(f)   #使用自定义函数格式化价格
df['Mileage'] = df['Mileage'].apply(f) #使用自定义函数格式化里程
# In[ ]:
df.drop_duplicates(subset = ['Condition','Condition_Desc','Price','Location'],inplace = True) #删除指定变量重复的行
df.dropna() #直接删除法,等同:df.dropna(how='any',axis = 0)
df.dropna(how='any',axis = 1 ) #只要有缺失,就删除这一列
df['Price'].fillna(method = 'ffill') #前向填补
# In[ ]:
xbar = df.Price.mean()  #价格均值
xstd = df.Price.std()   #价格标准差
print('标准差法异常值上限检测:\n',any(df.Price> xbar + 2.5 * xstd))  #价格高于均值+2.5倍标准差
print('标准差法异常值下限检测:\n',any(df.Price< xbar - 2.5 * xstd))  #价格低于均值-2.5倍标准差
# In[ ]:
df['Price'].describe() #count 记录数量,mean 均值,std 标准差,min,最小值,25% 25分位数,75% 75分位数,max 最大值
# In[ ]:
Q1 = df.Price.quantile(q = 0.25)
Q3 = df.Price.quantile(q = 0.75)
IQR = Q3 - Q1  # 分位差
print('箱线图法异常值上限检测:\n',any(df.Price > Q3 + 1.5 * IQR))
print('箱线图法异常值下限检测:\n',any(df.Price < Q1 - 1.5 * IQR))
# In[ ]:
import matplotlib.pyplot as plt
get_ipython().run_line_magic('matplotlib', 'inline')
df.Price.plot(kind ='box')  #绘制箱线图
# In[ ]:
plt.style.use('seaborn') # 设置绘图风格
df.Price.plot(kind = 'hist', bins = 30, density = True) # 绘制直方图
df.Price.plot(kind = 'kde') # 绘制核密度图
plt.show() # 图形展现
# In[ ]:
P01 = df.Price.quantile(0.01) #创建1分位数,作为最小值
P99 = df.Price.quantile(0.99) #创建99分位数,作为最大值

df['Price_new'] = df['Price'] #先创建一个新变量,进行赋值,后面用盖帽法处理异常值
df.loc[df['Price'] > P99,'Price_new'] = P99 #凡是大于99分位数的都替换为99分位数
df.loc[df['Price'] < P01,'Price_new'] = P01#凡是小于1分位数的都替换为1分位数
# In[ ]:
df[['Price','Price_new']].describe()  #查看替换后的数据分布情况
# In[ ]:
df['Price_new'].plot(kind ='box') #绘制盖帽后的箱线图

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值