关于python:用pandas进行数据分析实战

29次阅读

共计 4801 个字符,预计需要花费 13 分钟才能阅读完成。


    装置 pandas 模块包,载入练习数据。
    在 pandas 中,罕用的载入函数是 read_csv。除此之外还有 read_excel 和 read_table,table 能够读取 txt。若是服务器相干的部署,则还会用到 read_sql,间接拜访数据库,但它必须配合 mysql 相干包。read_csv 领有诸多的参数,encoding 是最罕用的参数之一,它用来读取 csv 格局的编码。这里应用了 gb2312,该编码常见于 windows,如果报错,能够尝试 utf-8。
    sep 参数是宰割符,有些 csv 文件用逗号宰割列,有些是分号,有些是 \t,这些都须要具体设置。header 参数为是否应用表头作为列名。
    names 参数能够为列设置额定的名字,比方 csv 中的表头是中文,然而在 pandas 中最好转换成英文。



    通过输入咱们能够看到其表格的行与列数,但因为篇幅起因,显示中局部数据省略。咱们能够通过调整展现的长度及宽度显示更多文件信息。


    因为数据集的数据比拟多,如果咱们只想浏览局部的话,能够应用 head 函数,显示头部的数据,默认 5,也能够自在设置参数,如果是尾部数据则是 tail。
    不设置 head 函数参数,输入后果如下:

    设置 head 函数参数值为 7,后果输入如下:

    不设置 tail 函数参数,输入后果如下:

    设置 tail 函数参数为 6,输入后果如下:


    查看是否有反复数据,其中 positionId 是职位 ID,具备唯一性,咱们通过此列进行反复数据查看。


    咱们失去惟一值只有 5031 个,但依据表格共有 6876 个数据,咱们须要将反复数据革除。
应用 drop_duplicates 革除反复数据。

    drop_duplicates 函数通过 subset 参数抉择以哪个列为去重基准。keep 参数则是保留形式,first 是保留第一个,删除后余反复值,last 还是删除后面,保留最初一个。duplicated 函数性能相似,但它返回的是布尔值。
    接下来解决 salary 薪资数据。计算出薪资上限以及薪资下限。薪资内容没有非凡的法则,既有小写 k,也有大写 K,还有 k 以上等用法,k 以上只能上上限默认雷同。
    这里须要用到 pandas 中的 apply。它能够针对 DataFrame 中的一行或者一列数据进行操作,容许应用自定义函数。

    定义一个 cut_word 函数,它查找「-」符号所在的地位,并且截取薪资范畴结尾至 K 之间的数字,也就是咱们想要的薪资下限。
    apply 将 cut_word 函数利用在 salary 列的所有行。
    对于 k 以上写法的数据,find 函数会返回 -1,如果依照原来的形式截取,是 word[:-2],不是咱们想要的后果,所以须要加一个 if 判断。
    因为 python 大小写敏感,咱们用 upper 函数将 k 都转换为 K,而后以 K 作为截取。
输入 bottomSalary 及 topSalary 值。

    接下来进行均匀薪资的求解,在求均匀薪资前,咱们须要将须要应用数据转换为 int 类型再进行运算。

    数据类型转换为数字,这里引入新的知识点,匿名函数 lambda 作为一次性函数。
lambda x: *,后面的 lambda x: 了解为输出,前面的星号区域则是针对输出的 x 进行运算。案例中,因为同时对 top 和 bottom 求平均值,所以须要加上 x.bottomSalary 和 x.topSalary。word_cut 的 apply 是针对 Series,当初则是 DataFrame。
    axis 是 apply 中的参数,axis= 0 示意将函数用在行,axis= 1 则是列。输入下图后果。

    数据清理实现后,咱们将想要剖析的数据切选出,为后续的剖析。


    这里仍旧能够应用 head、tail 函数等设置参数查看开始和结尾的局部数据。
    上面对几个数据进行描述统计。
    value_counts 是计数,统计所有非零元素的个数,以降序的形式输入 Series。对 city 一列进行统计:
  
            
    对 education 一列进行统计:

       

    对于薪资的统计,咱们应用 describe 函数
        
             
    Describe 函数能疾速生成各类统计指标。薪资的平均数是 17k,中位数是 15k,最大薪资在 75k。
    标准差在 8.99k,有肯定的波动性,大部分薪资在 17±9k 之间。
个别分类数据用 value_counts,数值数据用 describe,这是最罕用的两个统计函数。
    pandas 自带绘图函数,它是以 matplotlib 包为根底封装,所以两者可能联合应用。
        
    
    用 hist 函数很不便的就绘制除出直方图。图表列出了薪资的散布,因为大部分薪资集中 20k 以下,为了更细的粒度。将直方图的宽距持续放大。


    数据分析的一大思维是细分维度,当初察看不同城市、不同学历对薪资的影响。箱线图是最佳的观测形式。


    图表的标签出了问题,呈现了白框,次要是图表默认用英文字体,而这里的都是中文,导致了抵触。所以须要改用 matplotlib。


    boxplot 是咱们调用的箱线图函数,column 抉择箱线图的数值,by 是抉择分类变量,figsize 是尺寸。从图上咱们看到,北京的薪资高于其余城市,尤其是中位数。上海和深圳稍次,广州甚至不如杭州。
    批改分类变量为 education,失去学历对薪资的影响箱线图。

        

    上述两个钻研均为繁多的变量的剖析,当初想晓得北京和上海这两座城市,学历对薪资的影响。


    在 by 传递多个值,箱线图的刻度主动变成元组,也就达到了横向比照的作用。在 pandas 中,须要同时用到多个维度剖析时,能够用 groupby 函数。它和 SQL 中的 group by 差不多,能将不同变量分组。

    上图是规范的用法,按 city 列,针对不同城市进行了分组。不过它并没有返回分组后的后果,只返回了内存地址。这时它只是一个对象,没有进行任何的计算,当初调用 groupby 的 count 办法。


    它返回的是不同城市的各列计数后果,因为没有 NaN,每列后果都是相等的。当初它和 value_counts 等价。
      
                
    换成 mean,计算出了不同城市的均匀薪资。因为 mean 办法只针对数值,而各列中只有 aveSalary 是数值,于是返回了这个惟一后果。

     

    groupby 能够传递一组列表,这时失去一组层次化的 Series。按城市和学历分组计算了均匀薪资。

    前面再调用 unstack 办法,进行行列转置,这样看的就更分明了。在不同城市中,博士学历最高的薪资在深圳,硕士学历最高的薪资在杭州。北京综合薪资最好。

  )

    这次换成 count,咱们在 groupby 前面加一个 avgSalary,阐明只统计 avgSalary 的计数后果,不必混入雷同数据。图上的后果很明确了,要求博士学历的岗位只有 6 个,所谓的均匀薪资,也只取决于公司开出的价码,波动性很强,毕竟这只是招聘薪资,不代表实在的博士退职薪资。这也解释了下面几个图表的异样。
    接下来计算不同公司招聘的数据分析师数量,并且计算平均数。


    这里应用了 agg 函数,同时传入 count 和 mean 办法,而后返回了不同公司的计数和平均值两个后果。所以前文的 mean,count,其实都省略了 agg。agg 除了零碎自带的几个函数,它也反对自定义函数。

      
    上图用 lambda 函数,返回了不同公司中最高薪资和最低薪资的差值。agg 是一个很不便的函数,它能针对分组后的列数据进行丰富多彩的计算。然而在 pandas 的分组计算中,它也不是最灵便的函数。
    上面想计算出不同城市,招聘数据分析师需要前 5 的公司,agg 尽管能返回计数也能排序,但它返回的是所有后果,前五还须要手工计算。所以咱们应用 apply 进行操作。

         

    自定义了函数 topN,将传入的数据计数,并且从大到小返回前五的数据。而后以 city 聚合分组,因为求的是前 5 的公司,所以对 companyShortName 调用 topN 函数。
    同样的,想晓得不同城市,各职位招聘数前五,也能间接调用 topN。

     
    agg 和 apply 是不同的,尽管某些办法相近,比方求 sum,count 等,然而 apply 反对更细的粒度,它能按组进行简单运算,将数据拆分合并,而 agg 则必须固定为列。
    使用 group by,咱们曾经能随便组合不同维度。接下来配合 group by 作图。

    多重聚合在作图下面没有太大差别,行列数据转置不要混同即可。


    上述的图例咱们都是用 pandas 封装过的办法作图,如果要进行更自在的可视化,间接调用 matplotlib 的函数会比拟好,它和 pandas 及 numpy 是兼容的。plt 曾经在上文中调用并且命名。

    上图将上海和北京的薪资数据以直方图的模式进行比照。因为北京和上海的分析师人数相差较远,所以无奈间接比照,须要用 destiny 参数转化为密度。设置 alpha 透明度,它比箱线图更直观。
    另外一种剖析思路是对数据进行深加工。咱们将薪资设立出不同的 level。

           

    cut 的作用是分桶,它也是数据分析罕用的一种办法,将不同数据划分出不同等级,也就是将数值型数据加工成分类数据,在机器学习的特色工程中利用比拟多。


    用 lambda 转换百分比,而后作沉积百分比柱形图 (matplotlib 如同没有间接调用的函数)。这里能够较为清晰的看到不同等级在不同地区的薪资占比。它比箱线图和直方图的益处在于,通过人工划分,具备业务含意。0~3 是实习生的价位,3~6 是刚毕业没有根底的新人,整顿数据那种,6~10 是有肯定根底的,以此类推。
    上面统计组标签一列的数据。
   

    str 办法容许咱们针对列中的元素,进行字符串相干的解决,这里的[1:-1] 不再是 DataFrame 和 Series 的切片,而是对字符串截取,这里把 [] 都截取掉了。如果漏了 str,就变成选取 Series 第二行至最初一行的数据。


    应用完 str 后,它返回的仍旧是 Series,当咱们想要再次用 replace 去除空格。还是须要增加 str 的。
    positionLables 自身有空值,所以要删除,不然容易报错。再次用 str.split 办法,把元素中的标签按「,」拆分成列表。


    通过 apply 和 value_counts 函数统计标签数。因为各行元素曾经转换成了列表,所以 value_counts 会逐行计算列表中的标签,apply 函数将 value_counts 利用在行上,最初将后果组成一张新表。

           

    用 unstack 实现行列转换,看上去有点怪,因为它是统计所有标签在各个职位的呈现次数,绝大多数必定是 NaN。
        

    将空值删除,并且重置为 DataFrame,此时 level_0 为标签名,level_1 为 df_index 的索引,也能够认为它对应着一个职位,0 是该标签在职位中呈现的次数。局部职位的标签可能呈现屡次,这里疏忽它。reset_index 能够还原索引,从新变为默认的整型索引。
    最初用 groupby 计算出标签呈现的次数。

          

    荡涤掉引号,设置词云相干的参数。因为在 jupyter 中显示图片,所以须要额定的配置 figsize,不然 wide 和 height 的配置有效。wordcloud 也兼容 pandas,所以间接将后果传入,而后显示图片,去除坐标。

正文完
 0