pandas预处理案例——数据分析师招聘数据清洗实战
数据分析师招聘数据清洗实战
- 数据导入并查看
- 重复数据处理
- 异常值处理
- 缺失值处理
数据是数据分析师的招聘薪资,主要内容是进行数据读取,数据概述,数据清洗和整理
数据获取:链接:https://pan.baidu.com/s/1sSmyiUfkDtVHuJEQP56h3w
提取码:okic
数据导入并查看
首先载入的数据在pandas中,常用的载入函数是read_csv。除此之外还有read_excel和read_table,table可以读取txt。若是服务器相关的部署,则还会用到read_sql,直接访问数据库,但它必须配合mysql相关包。
import pandas
df = pandas.read_csv('data/DataAnalyst.csv',encoding='gb2312')
#查看表数据
df.head(5)
查看表结构
df.info()
这里列举出了数据集拥有的各类字段,一共有6876个,公司id和职位id为数字,其他都是字符串。
重复数据处理
查看重复数据
print(len(df.positionId.unique()))
unique函数可以返回唯一值,数据集中positionId是职位ID,值唯一。原始值有6876,配合len函数计算出唯一值共有5031个,说明有多出来的重复值。
处理重复数据
df_duplicates=df.drop_duplicates(subset='positionId',keep='first')
df_duplicates.info()
drop_duplicates函数通过subset参数选择以哪个列为去重基准。keep参数则是保留方式,first是保留第一个,删除后余重复值,last还是删除前面,保留最后一个。duplicated函数功能类似,但它返回的是布尔值。
异常值处理
接下来加工salary薪资字段。目的是计算出薪资下限以及薪资上限。薪资内容没有特殊的规律,既有小写k,也有大小K。这里需要用到pandas中的apply。它可以针对DataFrame中的一行或者一行数据进行操作,允许使用自定义函数。
def cut_word(word):position = word.find ("-")bottomSalary = word[:position-1]return bottomSalary
df_duplicates.salary.apply(cut_word)
定义word_cut函数,它查找「-」符号所在的位置,并且截取薪资范围开头至K之间的数字,也就是想要的薪资上限。apply将word_cut函数应用在salary列的所有行。「k以上」这类脏数据怎么办呢?find函数会返回-1,如果按照原来的方式截取,是word[:-2],不是想要的结果,所以需要加一个if判断。
def cut_word(word):position = word.find ("-")if position != -1:bottomSalary = word[:position-1]else:bottomSalary = word[:word.upper().find("K")]return bottomSalary
df_duplicates["bottomSalary"] = df_duplicates.salary.apply(cut_word)
因为python大小写敏感,我们用upper函数将k都转换为K,然后以K作为截取。这里不建议用「以上」,因为有部分脏数据不包含这两字。
将bottomSalary转换为数字,如果转换成功,说明所有的薪资数字都成功截取了。
df_duplicates.bottomSalary.astype("int")
薪资上限topSalary的思路也相近,只是变成截取后半部分。
def cut_word(word,method):position = word.find ("-")if position != -1:bottomSalary = word[:position-1]topSalary = word[position+1:len(word)-1]else:bottomSalary = word[:word.upper().find("K")]topSalary = bottomSalaryif method == "bottom":return bottomSalaryelse:return topSalary
df_duplicates["topSalary"] = df_duplicates.salary.apply(cut_word,method = "top")
接下来求解平均薪资。
bottomSalary和topSalary数据类型转换为数字,并为数据集添加avgSalary列
df_duplicates.bottomSalary=df_duplicates.bottomSalary.astype("int")
df_duplicates.topSalary=df_duplicates.topSalary.astype("int")
df_duplicates['avgsalary'] = df_duplicates.apply(lambda x:(x.bottomSalary+x.topSalary)/2,axis=1)
数据类型转换为数字,这里引入新的知识点,匿名函数lamba。很多时候我们并不需要复杂地使用def定义函数,而用lamdba作为一次性函数。lambda x: ******* ,前面的lambda x:理解为输入,后面的星号区域则是针对输入的x进行运算。案例中,因为同时对top和bottom求平均值,所以需要加上x.bottomSalary和x.topSalary。word_cut的apply是针对Series,现在则是DataFrame。axis是apply中的参数,axis=1表示将函数用在行,axis=1则是列。这里的lambda可以用(df_duplicates.bottomSalary + df_duplicates.topSalary)/2替代。
缺失值处理
查看缺失数据存在的列
df_duplicates.isnull().any()
其中companyLabelList,businessZones,secondType,positionLables都存在为空的情况。由于这些字段的缺失值不能向前或者向后填充,单独填充的话数据量也很大,因此为了是数据更加精准,将有空值的行直接删除
df_duplicates.dropna(axis=0, how='any', inplace=True)
再次查看
df_duplicates.isnull().any()
到此,数据清洗的部分完成。切选出我们想要的内容
查看一下已经处理好的数据
df_duplicates.head(10)
pandas预处理案例——数据分析师招聘数据清洗实战相关推荐
- mysql数据生产数据分析_基于MySQL玩转SQL数据分析课程 互联网数据分析师-SQL数据分析实战视频教程...
基于MySQL玩转SQL数据分析课程 互联网数据分析师-SQL数据分析实战视频教程 课程目录 (1)SQL与数Ju分析;目录中文件数:23个 (1) 开课-课时3SQL与数Ju库的价值.flv (2) ...
- 数据分析师招聘岗位分析
数据分析师招聘岗位分析 1.本文的目的和内容 1.1.本文的目的: 通过分析能够了解公司对于数据分析岗位的要求及待遇 1.2本文的内容: 主要针对以下几个问题: 1.数据分析岗位不同城市的需求分布: ...
- 深圳python数据分析师招聘_Python爬取智联招聘数据分析师岗位相关信息的方法
Python爬取智联招聘数据分析师岗位相关信息的方法 发布时间:2020-09-23 23:23:12 来源:脚本之家 阅读:88 进入智联招聘官网,在搜索界面输入'数据分析师',界面跳转,按F12查 ...
- 成都数据分析师招聘:北京东方国信科技股份有限公司
北京东方国信科技股份有限公司 东方国信(北京东方国信科技股份有限公司)成立于1997年,是中国领先的大数据上市科技公司(股票代码 300166).自成立以来,东方国信就专注于大数据领域,紧跟全球大数据 ...
- 天马资产 | 金融数据分析师招聘(社招+实习)
量化投资与机器学习微信公众号,是业内垂直于量化投资.对冲基金.Fintech.人工智能.大数据等领域的主流自媒体.公众号拥有来自公募.私募.券商.期货.银行.保险.高校等行业30W+关注者. 公司介绍 ...
- 数据分析师招聘情况之python分析
项目简介: 通过此次数据分析解决转行数据分析师是否合适的问题 目的: 1.不同城市数据分析师需求量: 2.总体薪酬分布: 3.不同城市薪酬分布情况: 4.数据分析师对经验的要求: 5.经验对薪酬的影响 ...
- 数据分析案例-数据分析师岗位招聘信息可视化
- 【机器学习】 - 数据预处理之数据归一化(标准化)与实战分析,正则化
一.为什么要进行数据归一化 定义:把所有数据的特征都归到 [0,1] 之间 或 均值0方差1 的过程. 原则:样本的所有特征,在特征空间中,对样本的距离产生的影响是同级的: 问题:特征数字化后,由于 ...
- 案例 - 数据分析师市场需求 - 202301
0. 项目介绍 0.1 背景 浪浪山的小野猪,想了解下外面的世界. 0.2 整体框架 1. 数据获取 1.1 目标网站 猎聘网,数据仅作为个人分析使用 1.2 抓取工具 八爪鱼.Python也可以抓, ...
最新文章
- Web API-路由(一)
- 【LeetCode】128. 最长连续序列
- ensp路由器无法启动_品胜云路由器Breed刷入详细教程,技巧和注意事项,功能大增...
- .Net MVC Cache 缓存技术总结
- win2000/2003 Discuz生存环境搭建及基础优化 攻略
- ubuntu16.04 TLS安装java
- 解决RTMP推送时间戳问题引起HLS切片不均匀导致手机浏览器播放卡顿的问题
- 记录自己的心路文字~
- 21天学通C语言-学习笔记(1)
- 一文读懂APU/BPU/CPU/DPU/EPU/FPU/GPU等处理器
- 小窗终曲说策划(有空就看看吧,可能对设计想法有所帮助,不仅仅是游戏方面
- 软件项目管理EAC、ETC的计算
- ValueError: Cannot assign “<...>“: the current database router prevents this relation.
- JAVA项目接入腾讯应用宝YSDK平台之QQ微信登录接入模式详解
- UNIX SIGTERM等信号意义
- 先验概率、后验概率、条件概率
- 炼狱与逐光——我的十杰博客获奖感言
- 浏览器性能和兼容性测试
- c语言读文件编译,C语言读取wav文件的问题,请大侠,编译问题。
- 前端每日实战:97# 视频演示如何用纯 CSS 创作一组昂首阔步的圆点
热门文章
- 线程通信,生产者消费者问题案例,模拟来电提醒和接听电话
- C语言随机刷新,C语言 刷新缓冲区
- HTTP网络连接相关知识整理(三):网络错误异常
- fastadmin 数据导出,设置excel行高和限制图片大小
- Note For Linux By Jes(16)-软件安装:原始码与 Tarball
- NHibernate3剖析:Configuration篇之SessionFactory lambda配置
- 生育登记服务制度啥意思?生育服务证和准生证一回事吗?生育那些事
- 绘声绘影导出视频过大
- Android中识别手柄JAVA_android蓝牙手柄监听 BluetoothGamepad
- 巯基吡啶PEG巯基吡啶,OPSS-PEG-OPSS