参考链接: Python | 使用Pandas进行数据分析

转载自http://mp.weixin.qq.com/s?__biz=MjM5NjEyMDI2MQ==&mid=2455947430&idx=1&sn=11da6ff57dbaeae9343e822ac8a2f3a7&chksm=b1787b0c860ff21a2568234ea1b5a1bf86c91c2b96ef876863f5dc11ad7de27510107a94c549&scene=21#wechat_redirect

主要内容是进行数据读取,数据概述,数据清洗和整理,分析和可视化。按照本教程,相信大家的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中最好转换成英文。

上述是主要的参数,其他参数有兴趣可以学习。一般来说,csv的数据都是干净的,excel文件则有合并单元格这种恶心的玩意,尽量避免。

现在有了数据df,首先对数据进行快速的浏览。

这里列举出了数据集拥有的各类字段,一共有6876个,其中companyLabelList,businessZones,secondType,positionLables都存在为空的情况。  公司id和职位id为数字,其他都是字符串。  因为数据集的数据比较多,如果我们只想浏览部分的话,可以使用head函数,显示头部的数据,默认5,也可以自由设置参数,如果是尾部数据则是tail。

数据集中,最主要的脏数据是薪资这块,后续我们要拆成单独的两列。

看一下是否有重复的数据。

unique函数可以返回唯一值,数据集中positionId是职位ID,值唯一。配合len函数计算出唯一值共有5031个,说明有多出来的重复值。

使用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作为截取。这里不建议用「以上」,因为有部分脏数据不包含这两字。

在word_cout函数增加了新的参数用以判断返回bottom还是top。apply中,参数是添加在函数后面,而不是里面的。这点需要注意。

把topSalary和bottomSalary都改成int类型的。  接下来求解平均薪资。

数据类型转换为数字,这里引入新的知识点,匿名函数lambda。很多时候我们并不需要复杂地使用def定义函数,而用lamdba作为一次性函数。

lambda x: * ,前面的lambda x:理解为输入,后面的星号区域则是针对输入的x进行运算。案例中,因为同时对top和bottom求平均值,所以需要加上x.bottomSalary和x.topSalary。word_cut的apply是针对Series,现在则是DataFrame。

axis是apply中的参数,axis=0表示将函数用在行,axis=1则是列。

这里的lambda可以用(df_duplicates.bottomSalary + df_duplicates.topSalary)/2替代。

到此,数据清洗的部分完成。切选出我们想要的内容进行后续分析(大家可以选择更多数据)。

先对数据进行几个描述统计。  value_counts是计数,统计所有非零元素的个数,以降序的方式输出Series。数据中可以看到北京招募的数据分析师一骑绝尘。

我们可以依次分析数据分析师的学历要求,工作年限要求等。

针对数据分析师的薪资,我们用describe函数。

它能快速生成各类统计指标。数据分析师的薪资的平均数是17k,中位数是15k,两者相差不大,最大薪资在75k,应该是数据科学家或者数据分析总监档位的水平。  标准差在8.99k,有一定的波动性,大部分分析师薪资在17+-9k之间。

一般分类数据用value_counts,数值数据用describe,这是最常用的两个统计函数。

说了这么多文字,还是不够直观,我们用图表说话。

pandas自带绘图函数,它是以matplotlib包为基础封装,所以两者能够结合使用。

首先加载字体管理包,设置一个载入中文字体的变量,不同系统的路径不一样。boxplot是我们调用的箱线图函数,column选择箱线图的数值,by是选择分类变量,figsize是尺寸。

ax.get_xticklabels获取坐标轴刻度,即无法正确显示城市名的白框,利用set_fontpeoperties更改字体。于是获得了我们想要的箱线图。改变字体还有其他方法,  大家可以网上搜索关键字「matplotlib 中文字体」,都有相应教程。

从图上我们看到,北京的数据分析师薪资高于其他城市,尤其是中位数。上海和深圳稍次,广州甚至不如杭州。  现在来处理标签数据。

现在的目的是统计数据分析师的标签。它只是看上去干净的数据,元素中的[]是无意义的,它是字符串的一部分,和数组没有关系。

你可能会想到用replace这类函数。但是它并不能直接使用。df_clean.positionLables.replace会报错,为什么呢?因为df_clean.positionLables是Series,并不能直接套用replace。apply是一个好方法,但是比较麻烦。

这里需要str方法。

dropna()将所有含有NaN项的行删除,dropna()经常用来清理无效数据。  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是该标签在职位中出现的次数,之前我没有命名,所以才会显示0。部分职位的标签可能出现多次,这里忽略它。reset_index可以还原索引,重新变为默认的整型索引。

最后用groupby计算出标签出现的次数。到这里,已经计算出我们想要的结果。除了这种方法,也可以使用for循环,大家可以试着练习一下,效率会慢不少。  这种写法的缺点是占用内存较大,拿空间换时间,具体取舍看大家了。

加载wordcloud,anaconda没有,自行下载吧。清洗掉引号,设置词云相关的参数。因为我是在jupyter中显示图片,所以需要额外的配置figsize,不然wide和height的配置无效。wordcloud也兼容pandas,所以直接将结果传入,然后显示图片,去除坐标。大功告成。

[转载] 用pandas进行数据分析实战相关推荐

  1. 用pandas进行数据分析实战

    转载自http://mp.weixin.qq.com/s?__biz=MjM5NjEyMDI2MQ==&mid=2455947430&idx=1&sn=11da6ff57dba ...

  2. Python数据分析实战基础 | 初识Pandas

    这是Python数据分析实战基础的第一篇内容,主要是和Pandas来个简单的邂逅.已经熟练掌握Pandas的同学,可以加快手速滑动浏览或者直接略过本文. 01  重要的前言 这段时间和一些做数据分析的 ...

  3. 《Python数据分析实战》day2: Pandas中取得某行或者是某列的一点思考

    今天看了<Python数据分析实战>这本书的第四章:Pandas的简介的部分,大概看了一半,在实践代码的时候发现了jupyter notebook提示warning,研究了一下有了一些自己 ...

  4. Pandas数据分析实战01--Abalone Data Set(鲍鱼数据集)

    Pandas数据分析实战01 1. 数据描述 2. 数据读取 3. 数据呈现 4. 数据分析 打算从基础开始学习数据分析,给自己一个整理内容和学习消化的时间,所以,这也将成为我的学习笔记. 1. 数据 ...

  5. pandas数据分析实战之apply函数应用

    使用apply函数与字符匹配进行数据分析 1.apply函数使用 2.字符串匹配 3.数据分析实战 1.apply函数使用 DataFrame.apply(self, func, axis=0, ra ...

  6. Pandas数据分析实战案例之青春有你2(获取人物名称与头像)

    Pandas数据分析实战案例之青春有你2 看前须知:如果有需要借鉴的地方的话,可以把 导出数据 和 下载图片 的地址改掉.除此以外,可能定义函数的时候里面的 获取资料地址有误 ,会显示404,在文章末 ...

  7. Python数据分析实战(2)使用Pandas进行数据分析

    文章目录 一.Pandas的使用 1.Pandas介绍 2.Pandas基本操作 Series的操作 创建DataFrame 常见列操作 常见行操作 DateFrame的基本操作 时间操作 3.Pan ...

  8. 万字长文,Python数据分析实战,使用Pandas进行数据分析

    文章目录 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识. 那么针对这三类人,我 ...

  9. Python数据分析实战

    Python数据分析实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1nlHM1IW8MYg3z79TUwIsWg 提取码:ux8t 复制这段内容后打开百度网盘手 ...

最新文章

  1. iOS开发-面试总结(九)
  2. 未来科学家数学与计算机奖,未来科学大奖“对话未来科学家”
  3. FeignClient使用
  4. Collections 工具类常见方法
  5. python 查询包_查找Python包的依赖包(语句)
  6. JAVA导入导出Excel
  7. CSS3实现卡片翻转动画
  8. eclipse设置保护眼睛的背景色与字体
  9. SQL Server基础知识
  10. USDP使用笔记(二) 部署免费的USDP大数据双集群替代CDH CDP与HDP
  11. 有监督学习-逻辑回归sklearn应用举例
  12. STM32F7+STM32CubeMX5.21+SD+FATFS
  13. 在Linux如何搭建Oracle11g Data Guard
  14. 拼多多618来了:500余家官旗齐聚“品牌专场”,发放30亿消费红包
  15. vsphere虚拟服务器备份,使用云祺虚拟机备份软件快速备份VMware vSphere虚拟机
  16. 2019年信息安全工程师上午真题及答案解析
  17. Miracast投屏反控
  18. 二分查找的迭代算法和递归算法
  19. 阿里巴巴集群跟踪数据 Cluster Data V2017翻译文档
  20. FTDI 234XD USB转串口 PC识别串口固定的解决方法

热门文章

  1. NYOJ11 - 奇偶数分离
  2. php 密匙加密解密,带密匙的php加密解密示例分享
  3. python 命令行运行 多进程_Python初学——多进程Multiprocessing
  4. java实现数据结构-堆排序
  5. TCP和UDP的不同
  6. bzoj 4818: [Sdoi2017]序列计数(DP+矩阵快速幂)
  7. 看了这篇c语言结构体精讲解,你难道还怕你不会吗?
  8. Perceptual Losses for Real-Time Style Transfer and Super-Resolution
  9. zynq开发系列6:创建AXI IP实现PS对PL的数据配置(步骤三配置SDK)
  10. WUSTOJ 1285: Factors(Java)