3. 清洗常用4板斧
2020/7/7 17:27:07
本文主要是介绍3. 清洗常用4板斧,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
引言
这是Python数据分析实战基础的第三篇内容,主要对前两篇进行补充,把实际数据清洗场景下常用但零散的方法,按增
、删
、查
、分
四板斧的逻辑进行归类,以减少记忆成本,提升学习和使用效率。
数据集
一级流量
流量级别 | 投放地区 | 访客数 | 支付转化率 | 客单价 | 支付金额 |
---|---|---|---|---|---|
一级 | A区 | 44,300 | 11.78% | 58.79 | 306,887.83 |
一级 | B区 | 30,612 | 13.85% | 86.64 | 367,338.10 |
一级 | C区 | 18,389 | 2.50% | 0.28 | 129.58 |
一级 | D区 | 4,509 | 10.73% | 64.12 | 31,035.14 |
一级 | E区 | 3,769 | 5.73% | 92.91 | 20,068.20 |
一级 | F区 | 2,424 | 22.07% | 89.33 | 47,791.60 |
一级 | G区 | 2,412 | 8.21% | 56.04 | 11,096.42 |
二级流量
流量级别 | 投放地区 | 访客数 | 支付转化率 | 客单价 | 支付金额 |
---|---|---|---|---|---|
二级 | A区 | 29,111 | 10.66% | 87.4 | 271,189.23 |
二级 | B区 | 17,165 | 22.71% | 91.22 | 355,662.39 |
二级 | C区 | 8,870 | 0.78% | 44.52 | 3,072.00 |
三级流量
流量级别 | 投放地区 | 访客数 | 支付转化率 | 客单价 | 支付金额 |
---|---|---|---|---|---|
三级 | A区 | 45,059 | 13.66% | 90.11 | 554,561.22 |
三级 | B区 | 2,133 | 10.83% | 74.48 | 17,204.50 |
三级 | C区 | 899 | 9.90% | 92.99 | 8,276.50 |
三级 | D区 | 31 | 0.00% | ||
三级 | E区 | 17 | 0.00% |
上述三个级别数据在同一个excel中不同Sheet中。
首先,导入案例数据集。因为案例数据存放在同一个Excel表的不同Sheet
下,我们需要指定sheetname分别读取:
1 增——拓展数据维度
1. 纵向合并
这三个sheet的数据,维度完全一致(每列数据都是一样),纵向合并起来分析十分方便。说到纵向合并,concat大佬不请自来,他的招式简单明了 pd.concat([表1,表2,表3])
,对于列字段统一的数据,我们只需把表依次传入参数:
其实把我参数axis设置成1就可以横向合并
说时迟那时快,我一个箭步冲上去捂住他的嘴巴,牛逼的人做好一件事就够了,横向的就交给merge
吧~!
温馨提示
:pandas中很多函数功能十分强大,能够实现多种功能,但对于萌新来说,过多甚至交叉的功能往往会造成懵B的状态,所以这里一种功能先只用一种方式来实现。
2. 横向合并
横向合并涉及到连接问题,为方便理解,我们构造一些更有代表性的数据集练手:
h1 = pd.DataFrame({'语文':[93,80,85,76,58],'数学':[87,99,95,85,70],'英语':[80,85,97,65,88]},index=['韩梅梅','李雷','李华','王明','铁蛋']) h1 h2 = pd.DataFrame({'篮球':[93,80,85,76],'舞蹈':[87,99,95,85]},index=['李华','王明','铁蛋','刘强']) h2 复制代码两个DataFrame是两张成绩表,h1是5位同学的数学、英语、语文成绩,h2是4位同学的篮球和舞蹈成绩,现在想
找到并合并两张表同时出现的同学及其成绩
,可以用merge方法:
pd.merge(left=h1,right=h2,left_index=True,right_index=True,how='inner') 也可以指定 左右表关联的字段哦 data = pd.merge(left=intopiece_label, right=intopiece_pr, how="inner", left_on="order_number",right_on="order_number") 复制代码我们来详解一下merge的参数,
left
和rgiht
分别对应着需要连接的左表和右表,这里语数外成绩表是左表,篮球、舞蹈成绩是右表。
left_index
与right_index
是当我们用索引(这两个表的名字在索引中)连接时指定的参数,设置为on表示用该表的索引作为连接的条件(或者说桥梁)。假设姓名是单独的一列值,且需要根据姓名进行匹配,那就需要用·left_on = '姓名',right_on = '姓名·,我们可以分别指定左表的匹配列和右表的匹配列。
how
是指定连接方式,这里用的inner
,表示我们基于姓名索引来匹配,只返回两个表中共同
(同时出现)姓名的数据。下面详解一下inner还涉及到的其他参数——left
、right
、outer
。
左右连接(left和right):
左连接(left)和右连接(right),我们可以直观理解为哪边的表是老大,谁是老大,就听谁的(所有行全部保持),先看左连接,左表h1原封不动,右边根据左表进行合并,如果存在相关的名字,就正常返回数据,如果不存在(韩梅梅、李雷),就返回空(NAN)值;右连接就是听右表的,左表有则返回无则为空。外连接(outer):
外连接是两张表妥协的产物,我的数据全保留,你的也全保留,你有我无的就空着,你无我有的也空着。跟SQL中的操作几乎类似。2 删——删空去重
1. 删空
在一些场景,源数据的缺失(空值)对于分析来说是干扰项,需要系统的删除。上文我们合并后的df数据集就是有缺失数据的:
要删除空值,一个dropna
即可搞定:
dropna
函数默认删除所有出现空值的行,即只要一行中任意一个字段为空,就会被删除。我们可以设置subset
参数,例如dropna(subset = ['city'])
,来指定当一行中的city
字段为空时,才会被删除。
2. 去重
drop_duplicates()
说是讲去重,但是案例数据比较干净,没有两行数据是完全一样的,所以我们要制造点困难,增加几行重复值:
drop_duplicates
方法去重默认会删掉完全重复
的行(每个值都一样的行),如果我们要删除指定列重复的数据,可以通过指定subset
参数来实现,假如我们有个奇葩想法,要基于流量级别
这列进行去重,则可以:
我们会发现,流量有三个级别,通过指定subset参数,我们删除了这个字段重复的行,保留了各自不重复的第一行。继续展开讲,在源数据中,流量渠道为一级
的有7行数据,每行数据其他字段都不相同,这里我们删除了后6行,只保留了第一行,但如果我们想在去重的过程中删除前面6行,保留最后一行
数据怎么操作?答案很简单,指定keep
参数即可。
keep
值等于last
,保留最后一行数据,不输入keep
值时,系统默认会给keep
赋值为first
,就会保留第一行数据而删掉其他的。
3 查——基于条件查询
查,不是单纯的返回几行数据,而是根据业务实际需求,基于一定的条
件查看和选择数据。
1 按条件索引/筛选
loc独白
:你没有看错,哥的分量实在是太重了,所以又来抢个沙发,刷个脸熟。
需求
:是筛选出访客数大于10000的一级渠道,loc一下:
2. 3.2 排序
很多情况下,我们都需要通过排序来观察数据规律,以及快速筛选出TOP N的数据项。对于案例数据,我们怎么样按交易金额进行排序并筛选出TOP3的渠道呢?
问题的关键就在于排序,这个时候sort_values函数就派上用场了:
整个操作十分简单,sort_values
函数,顾名思义是按照数值进行排序,首先要传入的参数是列参数
,即我们根据哪一列的数值来进行排序,ascending
参数决定了排序顺序,等于Flase则是从大到小的降序,设置为True则是升序。
排序完之后,筛选TOP3渠道就非常简单:
补充一个知识点,如果跟着文章操作,会发现无论是删空的dropna,还是去重的drop_duplicates,或者是排序的sort_values,在对源数据进行操作后,源数据并未改变
,这是因为我们没有对这几个函数的inplace
值进行设置,如果设置成inplace = True
,删空、去重和排序都会在源数据上生效
。
但这里为了避免出现不必要的错误而无法更改,更建议大家把操作后的源数据赋值给新的变量
,如new = df.dropna()
,而不是将源数据的inplace参数设置为True。跟Scala 还有Spark的 机制类似。
4 分——分组和切分
话天下大势,合久必分,数据亦是如此。在分组的版块中,我们重点介绍groupby
分组和cut
切分。
1分组
在案例数据中,总的流量级别有三级,每一级下又有多个投放地区,如果我们想汇总看每个级别流量所对应的总访客数和支付金额,就需要用到分组了。
groupby是分组函数,最主要的参数是列参数
,即按照哪一列或者哪几列(多列要用列表外括
)进行汇总,这里是按照流量级别:
流量级别作为汇总的依据列
,默认转化为索引列
,如果我们不希望它变成索引
,向groupby内传入参数as_index = False
即可:
2 切分
切分(分桶)操作常用于一维数组的分类
和打标
,cut函数能够高效的完成任务。它的主要参数和用法如下:
pd.cut(x,bins,right,labels) 复制代码
- 第一个参数
x
是我们要传入跟切分的一维数组,可以是列表,也可以是DataFrame的一列 bins
表示切分方式,可以自定义传入列表[a,b,c] 表示按照a-b-c区间进行切分,也可以输入数值(比如5)直接将数据分成5份。right
的值可以设置为True 或 False,当为True时候表示分组区间是包含右边,不包含左边。等于False表示含左不含右。labels
就是打标参数,我们把某列数据切分为3组,每一组给他们设置一个标签 比如[低,中,高]
不要被复杂的解释迷惑,一个例子就完全搞懂了。以案例数据为例,每个渠道都有对应的访客数,我们现在希望对各渠道访客级别进行评估,按照访客数大小,分成辣鸡(流量100以内的)、百级、千级和万级的渠道。
因为我们想对流量级别进行百、千、万的归类,所以把分组数值标准传入bins参数
。从结果可以看到,在不设置right的情况下,分组区间是默认左开右闭的
,而我们希望的是左闭右开,即百级流量渠道访客数在0-99之间,所以需要将right值设置为False。
下面我们直接对分组后的数据进行打标,访客数在0-99设置为辣鸡
,100-999设置为百级,千级和万级以此类推,同时将打好标签的数据作为新列给到源数据:
df['分类标签'] = pd.cut(x=df['访客数'],bins=[0,100,1000,10000,100000],right=False,labels=['垃圾','百级','千级','万级']) 复制代码
非常高效,一行半代码就搞定了分组、判断和打标的过程。
总结
本文从增
、删
、查
、分
四个模块,分别介绍了横向
、纵向
合并;删空
、去重
;筛选
、排序
和分组
、切分
等数据清洗过程中的常见操作。在实际运用中,各操作往往是你中有我,我中有你,共同为了营造一个干净
的数据而努力。
这篇关于3. 清洗常用4板斧的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-24Java中定时任务实现方式及源码剖析
- 2024-11-24Java中定时任务实现方式及源码剖析
- 2024-11-24鸿蒙原生开发手记:03-元服务开发全流程(开发元服务,只需要看这一篇文章)
- 2024-11-24细说敏捷:敏捷四会之每日站会
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解