爬虫练习之数据整理——基于Pandas

news/2024/7/3 5:15:38

上一篇->爬虫练习之数据清洗——基于Pandas

本次以51Job上在东莞地区爬取的以Java为关键词的招聘数据
包括salary company time job_name address字段

目的

本次数据整理的小目标是将薪资数据拿出来单独处理为统一的格式, 以便后续的数据统计分析和可视化操作

思路

先来看看数据有多丑

薪资原始数据示例
薪资原始数据示例

可以看到除了常规的几千/月, 还有几万/月, 以及几万/年
不过, 没看到XX以上的数据. 但是, 你还是要考虑到啊

根据数据格式, 可以把薪资拆成两行, 以 - 作为分割点, 然后对数据分情况整理, 根据拆分后数据位置得到底薪和薪资上限

代码

  1. 获取底薪

这里需要分三种情况(实际是四种, 不过XX千/年这种数据并没有出现)
XX千/月, XX万/月, XX万/年
思路是

判断: XX千/月, XX万/月, XX万/年
找到'-'位置
万/月和万/年需要进行转化
得到底薪

如果遇到没有上限的数据, 另外写个判断即可
函数代码如下

# coding=utf-8
def cut_word(word):
    if(word.find('万') == -1):
        # XX千/月
        postion = word.find('-')
        bottomSalary = word[postion-1]
    else:
        if(word.find('年') == -1):
            # XX万/月
            postion = word.find('-')
            bottomSalary = word[postion-1] + '0.0'      
        else:
            # XX万/年
            postion = word.find('-')
            bottomSalary = word[postion-1]
            bottomSalary = str(int(bottomSalary) / 1.2)
    return bottomSalary
  1. 获取薪资上限

获取薪资上限的思路与获取底薪的思路一致, 稍改代码即可
这里有一个中文坑, 在utf-8的编码环境下, 一个中文占3个字节, 所以像'万/年'这些, 要减去7才能得到正确结果, 而不是减去3
这里把两个方法合并于一个函数, 通过变量来获得上下限
考虑到还有0.X这种数字, 使用类似```bottomSalary = word[:(postion)] + '0.0'``这样的代码会出现以下情况

错误示范

函数代码如下

def cut_word(word, method):
    if method == 'bottom':
        if(word.find('万') == -1):
            # XX千/月
            postion = word.find('-')
            bottomSalary = str(float(word[:(postion)]))
        else:
            if(word.find('年') == -1):
                # XX万/月
                postion = word.find('-')
                bottomSalary = str(float(word[:(postion)]) * 10)         
            else:
                # XX万/年
                postion = word.find('-')
                bottomSalary = word[:(postion)]
                bottomSalary = str(int(bottomSalary) / 1.2)
        return bottomSalary
    if method == 'top':
        length = len(word)
        if(word.find('万') == -1):
            # XX千/月
            postion = word.find('-')
            topSalary = str(float(word[(postion+1):(length-7)]))
        else:
            if(word.find('年') == -1):
                # XX万/月
                postion = word.find('-')
                topSalary = str(float(word[(postion+1):(length-7)]) * 10)         
            else:
                # XX万/年
                postion = word.find('-')
                topSalary = word[(postion+1):(length-7)]
                topSalary = str(int(topSalary) / 1.2)
        return topSalary

函数写完验证下结果
这里用到pandas模块的apply方法, 对某一行数据应用自定义函数

# 添加底薪列
df_clean['bottomSalary'] = df_clean.salary.apply(cut_word, method='bottom')
df_clean['topSalary'] = df_clean.salary.apply(cut_word, method='top')
# 选择salary, bottomSalary, topSalary列
df_clean[['salary', 'bottomSalary', 'topSalary']] 

选择与薪水有关的列显示, 可以看到结果符合预期(后两列的单位是K)


  1. 计算平均薪资
df_clean['bottomSalary'] = df_clean['bottomSalary'].astype('float')
df_clean['topSalary'] = df_clean['topSalary'].astype('float')
df_clean['avgSalary'] = df_clean.apply(lambda x : (x.bottomSalary + x.topSalary) / 2, axis = 1)

参考文献
知乎——用pandas进行数据分析实战
https://zhuanlan.zhihu.com/p/27784143

http://www.niftyadmin.cn/n/4596950.html

相关文章

cookie sessionStorage localStorage区别

cookie sessionStorage localStorage区别 cookie数据始终在同源的http请求中携带(即使不需要),即cookie在浏览器和服务器间来回传递 cookie数据还有路径(path)的概念,可以限制。cookie只属于某个路径下 存储大小限制也不同&#…

RNAseq 流程

https://github.com/twbattaglia/RNAseq-workflow

.net object对象操作json数组,并且获取object对象中数组所对应的值

using Newtonsoft.Json; string jsonstr "[{\"id\":1,\"name\":\"张三\"},{\"id\":2,\"name\":\"李四\"}]"; List<object> sg new List<object>(); var json JsonConvert.DeserializeAn…

工作中遇到的问题用第三方如何解决input默认的背景色

javascri 在input中 假如要去掉placeholder的默认背景色 则-webkit-box-shadow: 0 0 0 1000px white inset; }

去掉第三放的el-table的默认背景色父元素穿透

.el-table, .el-table__expanded-cell {background-color: transparent!important;}.el-table th, .el-table tr {border: 0!important;background-color: transparent!important;}.父元素>>> .el-table, .父元素 >>> .el-table__expanded-cell {background-…

Spring入门之HelloSpring

2019独角兽企业重金招聘Python工程师标准>>> Spring描述: -轻量级&#xff1a;Spring是非侵入式的-基于Spring开发的应用中的对象可以不依赖于Spring的API -依赖注入&#xff08;DI---dependency injection&#xff0c;IOC&#xff09; -面向切面编程&#xff08;AO…

关于koa的起服务

关于koa的起服务 第一步&#xff1a;全局安装 koa-generator npm install koa-generator -g 第二步&#xff1a;使用 koa-generator 生成 koa 项目 # 项目名字为&#xff1a;myproject koa2 myproject # 进入 myproject 项目 cd myproject # 安装 npm install 第四步&#xff1…

ES6学习笔记八:类与继承

一&#xff1a;Class ES6 提供了更接近传统语言的写法&#xff0c;引入了 Class&#xff08;类&#xff09;这个概念&#xff0c;作为对象的模板。通过class关键字&#xff0c;可以定义类。 定义“类”的方法的时候&#xff0c;前面不需要加上function这个关键字&#xff0c;直…