2. 灵活的Pandas索引

序言

学习了Pandas的同学,有超过60%仍然投向了Excel的怀抱,之所以做此下策,多半是因为刚开始用Python处理数据时,选择想要的行和列实在太痛苦,完全没有Excel想要哪里点哪里的快感。

初识Pandas 教程考虑到篇幅问题只讲了最基础的列向索引,但这显然不能满足同志们日益增长的个性化服务(选取)需求。为了舒缓痛感,增加快感,满足需求,第二篇内容我们单独把索引拎出来,结合场景详细介绍两种常用的索引方式:

第一种是基于位置(整数)的索引,案例短平快,有个粗略的了解即可,实际中偶有用到,但它的应用范围不如第二种广泛。

第二种是基于名称(标签)的索引,这是要敲黑板练的重点,因为它将是我们后面进行数据清洗和分析的重要基石。

首先,简单介绍一下练习的案例数据:

流量来源 来源明细 访客数 支付转化率 客单价
一级 -A 35188 9.98% 54.3
一级 -B 28467 11.27% 99.93
一级 -C 13747 2.54% 0.08
一级 -D 5183 2.47% 37.15
一级 -E 4361 4.31% 91.73
一级 -F 4063 11.57% 65.09
一级 -G 2122 10.27% 86.45
一级 -H 2041 7.06% 44.07
一级 -I 1991 16.52% 104.57
一级 -J 1981 5.75% 75.93
一级 -K 1958 14.71% 85.03
一级 -L 1780 13.15% 98.87
一级 -M 1447 1.04% 80.07
二级 -A 39048 11.60% 91.91
二级 -B 3316 7.09% 66.28
二级 -C 2043 5.04% 41.91
三级 -A 23140 9.69% 83.75
三级 -B 14813 20.14% 82.97
四级 -A 216 1.85% 94.25
四级 -B 31 0.00%
四级 -C 17 0.00%
四级 -D 3 0.00%

和第一篇数据集一样,记录着不同流量来源下,各渠道来源明细所对应的访客数、支付转化率和客单价。数据集虽然简短(复杂的案例数据集在基础篇完结后会如约而至),但是有足够的代表性,下面开始我们索引的表演。

1. 基于位置(数字)的索引

先看一下索引的操作方式:

df.iloc[行索引,列索引]
第一个位置是行索引,输入我们要取哪几行位置的参数
第二个位置是列索引,输入我们要取哪几列的位置参数

我们需要根据实际情况,填入对应的行参数和列参数。

场景一(行选取)

目标:选择流量来源等于一级的所有行。

思路:手指戳屏幕数一数,一级的渠道,是从第1行到第13行,对应行索引是0-12,但Python切片默认是含首不含尾的,要想选取0-12的索引行,我们得输入0:13,列想要全部选取,则输入冒号即可。
在这里插入图片描述

场景二(列选取)

目标:我们想要把所有渠道的流量来源和客单价单拎出来看一看。
思路:所有流量渠道,也就是所有行,在第一个行参数的位置我们输入;再看列,流量来源是第1列,客单价是第5列,对应的列索引分别是0和4:
在这里插入图片描述
值得注意的是,如果我们要跨列选取,得先把位置参数构造成列表形式,这里就是[0,4],如果是连续选取,则无需构造成列表,直接输入0:5(选取索引为0的列到索引为4的列)就好。

场景三(行列交叉选取)

目标:我们想要看一看二级、三级流量来源、来源明细对应的访客和支付转化率

思路:先看行,二级三级渠道对应行索引是13:17,再次强调索引含首不含尾的原则,我们传入的行参数是13:18;列的话我们需要流量来源、来源明细、访客和转化,也就是前4列,传入参数0:4。
在这里插入图片描述

2. 基于名称(标签)的索引

为了建立起横向对比的体感,我们依然沿用上面三个场景。

场景一:选择一级渠道的所有行。

思路:这次我们不用一个个数位置了,要筛选流量渠道为一级的所有行,只需做一个判断,判断流量来源这一列,哪些值等于一级在这里插入图片描述
返回的结果由True和False(布尔型)构成,在这个例子中分别代表结果等于一级和非一级。在loc方法中,我们可以把这一列判断得到的值传入行参数位置Pandas会默认返回结果为True的行(这里是索引从0到12的行),而丢掉结果为False的行,直接上例子:在这里插入图片描述

场景二:我们想要把所有渠道的流量来源和客单价单拎出来看一看。

思路:所有渠道等于所有行,我们在行参数位置直接输入:,要提取流量来源和客单价列,直接输入名称到列参数位置,由于这里涉及到两列,所以得用列表包起来:
在这里插入图片描述

场景三:我们想要提取二级、三级流量来源、来源明细对应的访客和支付转化率。

思路:行提取用判断,列提取输入具体名称参数。

df2.loc[df2['流量来源'].isin(['二级','三级']),['流量来源','来源明细','访客数','支付转化率']]

在这里插入图片描述
此处插播一条isin函数的广告,这个函数能够帮助我们快速判断源数据中某一列(Series)的值是否等于列表中的值。拿案例来说,df[‘流量来源’].isin([‘二级’,‘三级’]),判断的是流量来源这一列的值,是否等于“二级”或者“三级”,如果等于(等于任意一个)就返回True,否则返回False。我们再把这个布尔型判断结果传入行参数,就能够很容易的得到流量来源等于二级或者三级的渠道。

既然loc的应用场景更加广泛,应该给他加个鸡腿,再来个接地气的场景练练手。
插入场景之前,我们先花30秒的时间捋一捋Pandas中列(Series)向求值的用法,具体操作如下:

df2['访客数'].mean()
df2['访客数'].std()
df2['访客数'].median()
df2['访客数'].max()
df2['访客数'].min()

只需要加个尾巴,均值、标准差等统计数值就出来了,了解完这个,下面正式进入场景四。

场景四:对于流量渠道数据,我们真正应该关注的是优质渠道,假如这里我们定义访客数、转化率、客单价都高于平均值渠道是优质渠道,那怎么找到这些渠道呢?

思路:优质渠道,得同时满足访客、转化、客单高于平均值这三个条件,这是解题的关键。先看看均值各是多少:
在这里插入图片描述
再判断各指标列是否大于均值:

df2['访客数'] > df2['访客数'].mean()
df2['支付转化率']> df2['支付转化率'].mean()
df2['客单价'] > df2['客单价'].mean()

在这里插入图片描述
要三个条件同时满足,他们之间是一个“且”的关系(同时满足),在pandas中,要表示同时满足,各条件之间要用&符号连接,条件内部最好用括号区分;如果是的关系(满足一个即可),则用|符号连接:

(df2['访客数'] > df2['访客数'].mean())&(df2['支付转化率']> df2['支付转化率'].mean())&(df2['客单价'] > df2['客单价'].mean())

在这里插入图片描述
这样连接之后,返回True则表示该渠道同时满足访客、转化率、客单价都高于均值的条件,接下来我们只需要把这些值传入到行参数的位置。

df2.loc[(df2['访客数'] > df2['访客数'].mean())&(df2['支付转化率']> df2['支付转化率'].mean())&(df2['客单价'] > df2['客单价'].mean()),:]

在这里插入图片描述
到这一步,我们直接筛选出了4条关键指标都高于均值的优质渠道。

这两种索引方式,分别是基于位置(数字)的索引基于名称(标签)的索引,关键在于把脑海中想要选取的行和列,映射到对应的行参数与列参数中去。

只要稍加练习,我们就能够随心所欲的用pandas处理和分析数据,迈过了这一步之后,你会发现和Excel相比,Python是如此的美艳动人。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章