热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python数据清洗数据预处理

1.重复值处理•数据清洗一般先从重复值和缺失值开始处理•重复值一般采取删除法来处理•但有些重复值不能删除,例如订单明细数据或交易明细数据等df.head(5)#

1. 重复值处理

• 数据清洗一般先从重复值和缺失值开始处理
• 重复值一般采取删除法来处理
• 但有些重复值不能删除,例如订单明细数据或交易明细数据等

df.head(5)
#对价格和里程数数据进行处理
# 自定义一个函数
def f(x):if '$' in str(x):x = str(x).strip('$')x = str(x).replace(',','')else:x = str(x).replace(',','')return float(x)
df['Price'] = df['Price'] .apply(f)
df['Mileage'] = df['Mileage'].apply(f)
print ('数据集是否存在重复观测: \n', any(df.duplicated()))
df[df.duplicated()] #查看那些数据重复
np.sum(df.duplicated()) #计算重复数量
df.drop_duplicates() #删除所有变量都重复的行, 注意没有加inplace = True
df.drop_duplicates(subset= ['Condition','Condition_Desc','Price','Location'],inplace=True) #按照两个变量重复来来去重
df.info()

2. 缺失值处理

• 缺失值首先需要根据实际情况定义
• 可以采取直接删除法
• 有时候需要使用替换法或者插值法
• 常用的替换法有均值替换、前向、后向替换和常数替换
在这里插入图片描述

df.apply(lambda x: sum(x.isnull())/len(x),axis= 0) #缺失比例
#删除法
df.dropna() #直接删除法
df.dropna(how='any',axis = 1 ) #只要有缺失,就删除这一列
df.dropna(how='any',axis = 0) #只要有缺失,就删除这一行,等价于df.dropna()
#axis = 0 或者 1代表的函数在数据集作用的方向,0代表沿着行的方向,1代表沿着列的方向
df.dropna(axis = 0,how='any',subset=['Condition','Price','Mileage']) # 1代表列,0代表行,只要有缺失,就删除这一行,基于三个变量

在数据分析中,实际上大部分时候都是按照行来进行删除的,很少会基于列来进行删除 列代表的是变量,是否删除删除列很多时候主要取决于缺失比例
使用替换法进行缺失值的填补
替换法

df.head(10)
df.Mileage.fillna(df.Mileage.mean()) # 年龄用均值填补
df.Mileage.fillna(df.Mileage.median()) #中位数填补
df[df['Exterior_Color'].isnull()]
df.Exterior_Color.fillna(df.Exterior_Color.mode()[0]) #众数填补
df.fillna(20) # 所有缺失用20填补
# 婚姻状况使用众数,年龄使用均值,农户家庭人数使用中位数
df.fillna(value = {'Exterior_Color':df.Exterior_Color.mode()[0],'Mileage':df.Mileage.mean()})
df['Exterior_Color'].fillna(method='ffill') #前向填补
df['Exterior_Color'].fillna(method='bfill') #后向填补

3. 异常值处理

• 指那些偏离正常范围的值,不是错误值
• 异常值出现频率较低,但又会对实际项目分析造成偏差
• 异常值一般用过箱线图法(分位差法)或者分布图(标准差法)来判断
• 异常值往往采取盖帽法或者数据离散化
在这里插入图片描述
异常值检测可以使用均值的2倍标准差范围,也可以使用上下4分位数差方法

# 判断年龄有什么异常值
# 剔除户主姓名,户主身份证号和年龄有缺失的样本
df.dropna(axis = 0,how='any',subset=['户主姓名','户主身份证号','age'],inplace = True) #1代表列,0代表行,只要有缺失,就删除这一行,基于三个变量
# 异常值检测之标准差法
xbar = df.Price.mean()
xstd = df.Price.std()
print('标准差法异常值上限检测:\n',any(df.Price> xbar + 2.5 * xstd))
print('标准差法异常值下限检测:\n',any(df.Price# 异常值检测之箱线图法
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 df.Price.describe()# 对年龄进行描述性统计
import matplotlib.pyplot as plt
%matplotlib inline
df.Price.plot(kind ='box')
# 导入绘图模块
import matplotlib.pyplot as plt
# 设置绘图风格
plt.style.use('seaborn')
# 绘制直方图
df.Price.plot(kind = 'hist', bins = 30, density = True)
# 绘制核密度图
df.Price.plot(kind = 'kde')
# 图形展现
plt.show()
# 用99分位数和1分位数替换
#计算P1和P99
P1 =df.Price.quantile(0.01); P99 = df.Price.quantile(0.99)
#先创建一个新变量,进行赋值,然后将满足条件的数据进行替换
df['Price_new'] = df['Price']
df.loc[df['Price'] > P99,'Price_new'] = P99
df.loc[df['Price'] df[['Price','Price_new']].describe()

4. 数据离散化

• 数据离散化就是分箱
• 一般常用分箱方法是等频分箱或者等宽分箱
• 一般使用pd.cut或者pd.qcut函数

pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)


  • x:类array对象,且必须为一维,待切割的原形式
  • bins:整数、序列尺度、或间隔索引。如果bins是一个整数,它定义了x宽度范围内的等宽面元数量,但是在这种情况下,x的范围在每个边上被延长1%,以保证包括x的最小值或最大值。如果bin是序列,它定义了允许非均匀bin宽度的bin边缘。在这种情况下没有x的范围的扩展。
  • right,布尔值。是否是左开右闭区间,right=True,左开右闭,right=False,左闭右开
  • labels,用作结果箱的标签。必须与结果箱相同长度。如果FALSE,只返回整数指标面元。
  • retbins,布尔值。是否返回面元
  • precision,整数。返回面元的小数点几位
  • include_lowest,布尔值。第一个区间的左端点是否包含

df.head(5)
df['Price_bin'] = pd.cut(df['Price_new'],5,labels=range(5))
df['Price_bin'].hist()
#自定义分段标准和标签
df['Price_new'].describe()
w = [100,1000,5000,10000,20000,50000]
df['Price_bin'] = pd.cut(df['Price_new'], bins =w,labels=['低','便宜','划算','中等','高'],right=False)
df['Price_bin'].value_counts()

pandas.qcut(x, q, labels=None, retbins=False, precision=3, duplicates=’raise’)


  • x
  • q,整数或分位数组成的数组。整数比如 4 代表 按照4分位数 进行切割
  • labels, 用作结果箱的标签。必须与结果箱相同长度。如果FALSE,只返回整数指标面元。
  • 原理都是基于分位数来进行离散化

k = 5
w = [1.0*i/k for i in range(k+1)]
df['Price_bin'] = pd.qcut(df['Price_new'],w,labels=range(k))
df['Price_bin'].hist()
#或者先计算分位数的值
k = 5
w1 = df['Price_new'].quantile([1.0*i/k for i in range(k+1)])#先计算分位数,在进行分段
w1[0] = w1[0]* 0.95 # 最小值缩小一点
w[-1] = w1[1]* 1.05 # 将最大值增大一点, 目的是为了确保数据在这个范围内
w1
df['Price_bin'] = pd.cut(df['Price_new'],w1,labels=range(k))
df['Price_bin'].hist()

推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • IB 物理真题解析:比潜热、理想气体的应用
    本文是对2017年IB物理试卷paper 2中一道涉及比潜热、理想气体和功率的大题进行解析。题目涉及液氧蒸发成氧气的过程,讲解了液氧和氧气分子的结构以及蒸发后分子之间的作用力变化。同时,文章也给出了解题技巧,建议根据得分点的数量来合理分配答题时间。最后,文章提供了答案解析,标注了每个得分点的位置。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
author-avatar
血色的蓮花
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有