在数据分析和建模的过程中,有相当多的时间要用在数据准备上:加载、清理、转换以及重塑。这些工作会占到分析师时间的80%或更多。幸运的是pandas和内置的Python标准库提供了高效、灵活的工具可以帮助我们轻松的做这些事情。
本文重点介绍通过pandas进行数据的清洗。数据处理中的清洗工作主要包括对需要分析的数据集中的缺失值(空值)、重复值、异常值的处理。对于数据清洗一般也是分两个步骤,第一步就是要很方便快速的找到需要处理的数据,如何快速找到数据中的缺失值(空值)、重复数据或异常的数据,第二步是对找到的数据根据自己的实际使用需求进行处理,如删除还是替换成其他的数据。

在许多数据分析工作过程中,由于对数据质量问题,缺失数据是经常发生的。对于数值数据,pandas使用浮点值NaN(Not a Number)表示缺失数据。在pandas中,还采用了R语言中惯用的缺失值表示法NA,它表示不可用not available。在统计应用中,NA数据可能是不存在的数据或虽然存在但是看不到。进行数据清洗对缺失数据进行分析,以判断数据采集的问题或缺失数据导致的偏差。
在pandas中通过isna()或isnull()方法判断空值,二者等价,用于判断一个series或dataframe各元素值是否为空的bool结果。需注意对空值的界定:即None或numpy.nan才算空值,而空字符串、空列表等则不属于空值;类似地,notna()和notnull()则用于判断是否非空。
看下实例:
import pandas as pd
import numpy as np
stud_data=pd.Series(['张三','李四',np.nan,[],'',None,'王五'])
stud_data
通过stud_data.isnull()和stud_data.isna()分别来判断空值

类似地,notna()和notnull()则用于判断是否非空

同样的对于DataFrame中的缺失数据判断也是一样的。
构建DataFrame
stud_df=pd.DataFrame(stud_data,columns=['student_name'])
stud_df

对于缺失值的处理有两种常用的方式,一是用按一定的策略对空值进行填充,二是对于缺失值干脆进行删除。
pandas中用户填充缺失值的方法是fillna(),可以按一定的策略对空值进行填充,如常数填充、向前/向后填充等,也可通过inplace参数确定是否本地更改。
stud_df[['student_name']].fillna('某某')

可以看到判断为缺失值的地方都填充了"某某",因为空字符串和空列表都不是缺失值,所以没有填充。
通过fillna(mathod=‘ffill’),mathod=‘ffill’ 向前填充和 mathod=‘bfill’ 向后填充,也就是说用前面的值来填充NA或用后面的值来填充NA
我们来增加一列性别列gender来看一下。
stud_gender_data=pd.Series([1,0,np.nan,'女',1,None,'男'])
stud_df['gender']=stud_gender_data
stud_df
stud_df[['gender']].fillna(method='ffill')

可以看到通过method=‘ffill’,将NaN和None前面的值填充端到了NaN和None。
用fillna()进行填充会返回一个填充好的数据集的副本,并没有对原始数据进行操作,如果要修改原始数据可以通过inplace参数确定是否本地更改。

如果想删除缺失值,那么使用 dropna() 函数与参数 axis 可以实现。在默认情况下,按照 axis=0 来按行处理,这意味着如果某一行中存在 NaN 值将会删除整行数据。如果在dropna()中传入how='all'将只会删除全为NA或NaN的行。示例如下:

重复数据也是在实际数据处理过程中碰到比较多的,处理重复数据就是在数据集中找出重复数据然后将其删除保留一个唯一不重复的数据。
pandas通过duplicated()方法检测各行是否重复,返回一个行索引的bool结果,可通过keep参数设置保留第一行、最后一行、无保留,例如keep=first意味着在存在重复的多行时,首行被认为是合法的而可以保留。
构造一个DataFrame来看一个实例:
data=pd.DataFrame({'key1':['A','B']*3+['B'],'key2':[1,1,2,3,3,4,4]})
data
data.duplicated()

pandas通过drop_duplicates()方法按行检测并删除重复的记录,也可通过keep参数设置保留项。由于该方法默认是按行进行检测,如果存在某个需要需要按列删除,则可以先转置再执行该方法。
data.drop_duplicates()

可以看到第7行也就是index为6的重复行被删除了。
当带了keep='last'参数时,保留最后一个重复项,前面的重复项将被丢弃。可以看到保留的是索引为6的,索引为5的重复项被丢弃了。

判断异常值的标准依赖具体分析数据,如大于或小于某个基线范围的值。
我们来看一个含有正态分布的DataFrame数据集
data=pd.DataFrame(np.random.randn(1000,4))
data.describe()

假设我们认为某列中绝对值大小超过3的是异常值,那么判断异常值就是要找出某列中大小超过3的值。
data[np.abs(col)>3]

要选出全部含有绝对值大小超过3的行,可以在布尔型DataFrame中使用any()方法。
data[(np.abs(data)>3).any(1)]

对于异常值,可以直接替换。
如:
data[np.abs(data)>3]=np.sign(data)*3
这样就可以将异常值替换为绝对值不大于3的

删除异常值,可以用pandas的drop()方法,接受参数在特定轴线执行删除一条或多条记录,可通过axis参数设置是按行删除还是按列删除
如删除第3列,列索引为2的列中绝对值>3的行
col=data[2]
data.drop(data[np.abs(col)>3].index,inplace=True)

可以看到本来有1000行的,删除了3行,再用data[np.abs(col)>3]验证,已经找不到数据了。
至此,本文通过实例介绍了pandas进行数据清洗包括缺失值、重复值及异常值的处理。数据清洗是数据分析前面的准备工作,数据质量的好坏将直接影响数据分析的结果。
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co