当前位置: 首页 > 后端技术 > Python

Python数据分析实战基础(二):清洗的4个常用坐标轴

时间:2023-03-26 01:21:32 Python

作者|吹牛Z源|数据不吹牛首先,导入案例数据集。因为案例数据存放在同一个Excel工作表的不同sheet中,所以我们需要指定sheetname来分别读取:下面这顿饭开始打扫。01添加——扩展数据维度1.1垂直合并这三个sheet的数据,维度完全一致(每列数据相同),非常方便垂直合并分析。说到垂直合并,concat高手不请自来。他的这一招简单明了——pd.concat([table1,table2,table3]),对于列字段统一的数据,我们只需要依次传表入参:concat老大继续说:“其实,把我的参数axis设置成1横向合并...”来不及了,很快,我冲上去捂住了他的嘴,“牛逼的人做的很好,一件事情就够了,还是横向合并吧~”肖Z温馨提示:pandas中的很多功能都很强大,可以实现多种功能,但是对于新手来说,功能太多甚至交叉往往会出问题,造成一种无知的状态,所以这里一个功能只用一种方式实现。1.2Horizo??ntalmerging水平合并涉及连接问题,为了方便理解,我们构造一些比较有代表性的数据集来练习:两个DataFrames是两张成绩单,h1是5个学生的数学、英语、语文成绩,h2是篮球和4名学生的舞蹈成绩,现在想查找并合并同时出现在两个表中的学生和他们的分数,可以使用merge方法:下面详细解释一下merge的参数,left和rgiht分别对应左表和上表右边,这里语文和数学的分数表是左边的表,篮球和舞蹈的分数表是右边的表。left_index和right_index是我们使用索引(两个表的名字在索引中)连接时指定的参数。设置为on表示使用表的索引作为连接条件(或桥接)。假设name是单列值,需要根据name进行匹配,那么就需要使用“left_on='name',right_on='name'”,我们可以指定左边的匹配列表和右表的匹配列分别。如何指定连接方式。这里的inner是指我们根据姓名索引进行匹配,只返回两个表中共同(同时出现)姓名的数据。下面详细解释一下inner-left,right,outer涉及的其他参数。Leftandrightjoins(左和右):leftjoins(左)和rightjoins(右),我们可以直观的了解到表的哪一边是老大,谁是老大,听谁的就好(所有行都保留),先看左边的Connection,左边的表h1保持原样,右边根据左边的表进行合并。如果有相关名称,则数据会正常返回。如果不存在(韩梅梅、李雷),则返回空(NAN)值;右连接是监听右表,如果左表存在则什么都不返回,否则为空。外连接(outer):外连接是两个表之间折衷的产物。我所有的数据都被保留,你的也被保留。你有的我没有的都是空的,你有的我的也都是空的。02删除——删除空白和去重2.1删除空白在某些场景下,源数据的缺失(空值)是分析的干扰项,需要系统地删除。上面我们合并的df数据集有缺失数据:要删除空值,可以做一个dropna:dropna函数默认删除所有有空值的行,也就是只要一行中任意字段为空,它将被删除删除。我们可以设置subset参数,比如dropna(subset=['city']),指定当某行city字段为空时,将其删除。2.2去重就是去重,但是case数据比较干净,没有两行数据是完全一样的,所以我们只好硬着头皮添加几行重复值:将源数据重复两次赋值给repeat,这样每一行数据都有重复的数据。删除重复数据,一行代码即可:drop_duplicates方法默认会删除重复的行(具有相同值的行)。如果我们要删除指定列中的重复数据,可以指定子集参数。实现,如果我们有个绝妙的想法,就是根据“流量级别”这一列去重,我们可以:我们会发现流量分为三个级别。通过指定子集参数,我们删除该字段的重复行,并保留相应的不重复第一行。继续展开,在源数据中,流量通道为“Level1”的数据有7行,每行数据的其他字段不同。这里我们删除了最后6行,只保留了第一行,但是如果我们要在去重时如何删除前6行,保留最后一行数据呢?答案很简单,指定keep参数即可。keep值等于last,保留最后一行数据。如果不输入keep值,系统默认赋值firsttokeep,保留第一行数据,删除其他数据。03Check——基于条件的查询,不是简单的返回几行数据,而是根据业务的实际需要,根据一定的条件来查看和选择数据。3.1Index/filterbyconditionloc独白:你没看错,哥的分量太重了,又来抢个沙发,熟悉下。这次的需求是过滤掉访问量大于10000的一级频道。定位:在行中设置参数,满足访问量大于10000和流量等级等于“1级”两个条件。3.2排序很多时候,我们需要通过排序来观察数据的规律,快速筛选出TOPN的数据项。对于案例数据,我们如何按照交易金额排序,筛选出TOP3通道?问题的关键在于排序。这时候sort_values函数就派上用场了:整个操作非常简单。sort_values函数,顾名思义,就是根据值进行排序。第一个传入的参数是column参数,也就是我们使用哪个column的值进行排序,ascending参数决定了排序的顺序,等于False是从大到小降序排列,设置为True按升序排列。排序后过滤TOP3通道就很简单了:加一个知识点,如果你跟着文章,你会发现无论是删除的dropna,去重的drop_duplicates,还是排序后的sort_values,对源数据进行操作后,源数据没有改变。这是因为我们还没有设置这些函数的就地值。如果设置为inplace=True,则删除、去重和排序都会对源数据生效。但是为了避免不必要的错误,这里不能更改,建议大家将操作后的源数据赋值给一个新的变量,比如new=df.dropna(),而不是设置源的inplace参数数据为真。04要点——分组与分割谈天下大势,久合必分,数据亦然。在分组部分,我们重点介绍groupby分组和cut分割。4.1分组案例数据中,总流量级别分为三个级别,每个级别下有多个分布区域。如果我们要汇总每一级流量对应的访客总数和支付金额,就需要用到分组。groupby是一个分组函数,最重要的参数是column参数,就是按照哪一列或者哪几列进行汇总(多列要用一个列表括起来),这里是按照流量级别的:可以看到,之后直接分组,不返回我们期望的数据,为了进一步获取数据,我们需要在分组的时候对相关字段进行计算(常用的计算方式有sum、max、min、mean、std):在它后面加上sum,也就是说我们先按照流量级别分组进行,然后对分组内的字段进行求和。由于没有指定用于求和的列,因此所有数字字段都被求和。这里我们只想要每个级别流量下的访问量和付费金额,需要指定参数:流量级别作为汇总的基础列,默认转为索引列。如果我们不希望它成为索引,将参数传入groupbyas_index=False:4.2切分切分(bucketing)操作常用于一维数组的分类和标记,cut函数可以高效完成任务.其主要参数及使用方法如下:不要被复杂的解释所迷惑,一个例子就完全明白了。以案例数据为例,每个频道都有对应的访客数,现在我们希望分析每个频道的访客数、几千、几万。我们要将流量级别分为百、千、万,所以我们将分组取值标准传入bins参数。从结果可以看出,如果不设置right,分组区间默认是左开右闭,但是我们想要的是左闭右开,也就是访问者的数量100级流量通道在0-99之间,所以我们需要设置正确的值为False。接下来,我们直接标记分组数据。访客数设置为“辣子鸡”0-99,100-999为100级,1000级,10000级,依此类推。同时将标注好的数据作为给源新列的效率非常高,一行半代码就完成了分组、判断和标注的过程。小结本文介绍了增删查分四个模块,并介绍了数据清洗过程中的常用操作,如横向合并、纵向合并;删除、重复数据删除;筛选、排序、分组和分割。在实际应用中,每一次操作往往是我中有你,你中有我,共同创造一个“干净”的数据。搜索···进入···小程序,解锁……更多专业内容和优质资讯,不要错过!