pandas中文本数据的拆分和提取

2023-11-08

本文主要分享文本数据的拆分,提取合并,为下一步可视化分析做好准备。
数据来源于boss与拉勾网数据分析岗位的招聘信息。
拉勾网的爬取方法见我的:
《Python selenium+beautifulsoup 登录爬取拉勾网》
《登录爬取拉勾网2.0 Python selenium》

环境配置

# Jupyter Notebook
%matplotlib inline
import pandas as pd
import warnings
warnings.filterwarnings('ignore')

原始数据如下:
在这里插入图片描述

【job_link】与【company_link】不需要,删掉
【company_describe】与【job_skills】使用jieba与wordcloud,本文不涉及。若对词云感兴趣,请见我博客:《Python jieba+wordcloud制作词云》
本文主要展示【experience】与【city】这两列的处理方法,其他列大同小异,不再赘述。

数据准备

bs=pd.read_csv('boss.csv',encoding='gbk')
lg=pd.read_csv('lagou.csv',encoding='gbk')
#合并数据,查看是否存在缺失值
all_data=pd.concat([bs,lg],ignore_index=True)
all_data.info()
#删除掉不需要的信息
del all_data['job_link']
del all_data['company_link']
#填充缺失值
all_data['company_describe']=all_data['company_describe'].fillna('暂无')

experience列的处理

在这里插入图片描述

这一列的文本其实是杂糅了经验及学历要求。但是如果只观察前几列,很容易忽略了一些异常数据。

使用【all_data.tail( )】观察发现有的数据是【\n10k-20k\n经验1-3年 / 本科\n】,呈现【薪资+经验+学历】这种形态,这需要我们将其分割处理成【经验+学历】,统一这一列的数据形式。
在这里插入图片描述

split的使用

pandas中使用split需要先将需要split的数据集转化为字符串。split( a,b)中的第一个参数【a】代表以某字符串作为分割点,第二个参数【b】代表分割次数,即分成【b+1】个元素。分割完成后会返回一个列表。提取列表中元素必须再次转化为字符串来进行。

#新建一列“e1”用来装切割好的,形式为“经验+学历”的文本
all_data['e1']=all_data.experience.str.split("k",2).str[2]

拆开来看,以字符串‘k’作为分割点,数据被分为了2类:不含有薪资的只有1个元素k的列表;含有薪资的有3个元素的列表。选取该列中所有列表的第三个元素,只有一个元素的列表会在【‘e1’】列中显示为NaN,而另一类就是我们想要的信息。
在这里插入图片描述
此时提取出来的【‘e1’】列存在很多的NaN:
在这里插入图片描述

fillna填充数据

以experience列的数据填充e1列的NaN数据,最终实现整列数据统一为【经验+学历】的形式。

all_data['e1']=all_data['e1'].fillna(all_data.experience)
all_data.tail(10)

处理好的e1为这个样子:
在这里插入图片描述

extract+正则表达

当文本数据出现字母与数字混合的这种形式就需要我们使用str.extract+正则表达式来进行提取。参数【expand=Fales】代表返回dataframe数据,若为True即为数据框。
extract中的正则表达式需要用引号包住

#正则匹配,匹配【开头为数字,结尾为数字的】
all_data['job_experience']=all_data['e1'].str.extract(('.*?(\d.*\d)'),expand=False)

在这里插入图片描述

findall 多条件匹配

上面的处理结果显示,有NaN存在,这是因为有的经验类别为【应届毕业生】,【不限】,【1年以下】。
findall与extract最直观的区别有二:findall会匹配多次,所有符合条件的元素返回一个group,而extract只匹配一次,直接返回数值;findall可以多条件匹配,而extract不可以。
例如,与上面同一个例子,函数换为extract( ),得到的是列表,见下图。
在这里插入图片描述
findall的多条件匹配,条件使用【“ ”】双引号包住,条件之间使用【|】隔开,匹配多次成功就会出现多个元素。

all_data['e1'].str.findall('经|不限|1年|应届')

在这里插入图片描述

当然,我们不需要这么做。

all_data['job_experience1']=all_data['e1'].str.findall('不限|1年|应届').str[0]

在这里插入图片描述

跟上面的fillna的例子相同

all_data['job_experience']=all_data['job_experience'].fillna(all_data.job_experience1)
all_data.job_experience.value_counts()

在这里插入图片描述

使用loc[ ]替换(一)

从上面的标签来看,表达得不够完整,我们使用loc[ ]来替换掉内容。
df.loc[df [‘需要替换的列名’] ==‘被替换的内容’,‘替换好以后存在那一列名下’] = ‘替换成的内容’

all_data.loc[all_data['job_experience']=='1年','job_experience']='1年以下'
all_data.loc[all_data['job_experience']=='应届','job_experience']='1年以下'
all_data.loc[all_data['job_experience']=='3-5','job_experience']='3-5年'
all_data.loc[all_data['job_experience']=='1-3','job_experience']='1-3年'
all_data.loc[all_data['job_experience']=='5-10','job_experience']='5-10年'
all_data.loc[all_data['job_experience']=='10','job_experience']='10年以上'
all_data.job_experience.value_counts()

在这里插入图片描述

替换当然不局限于原来的那一列,后文在以城市列为例。

删除筛选出来的数据

可以看出来,有奇怪的数据混进来了,应该是临时工或者兼职,删掉。
在这里插入图片描述

#删除job_experience列中带“/”的文本
all_data=all_data.drop(all_data[all_data['job_experience'].str.contains('/')].index)

这条代码一共三层,从里到外的含义分别是:
选取all_data里【job_experience】这一列中含有【/】的数据;
all_data[ ].index是得到所需数据的索引;
使用all_data.drop( )删除数据

最后,分离学历

degree='大专|本科|硕士|博士'
all_data['degree']=(all_data['e1'].str.findall(degree).str[0])
all_data['degree']=all_data['degree'].fillna('不限')
del all_data['e1']
del all_data['experience']
del all_data['job_experience1']

在这里插入图片描述

city 列的处理

先观察一下:
在这里插入图片描述

contains与loc[ ]提换(二)

我爬取的城市为北上广深,但原始数据多了区,需要替换,这里展示使用contains( )与loc替换的另一种方法。
使用contains之前需要先转化数据为字符串。contains会返回布尔值,含有所需寻找的字符串的数据为True。
这个方法可以大繁化简,锁定一些列中的特殊符号,比如上文使用的删除方法。

all_data.location.str.contains('北京')

在这里插入图片描述

all_data['bj']=all_data.location.str.contains('北京')
all_data['sh']=all_data.location.str.contains('上海')
all_data['gz']=all_data.location.str.contains('广州')
all_data['sz']=all_data.location.str.contains('深圳')
all_data.loc[all_data['bj']==True,'city']='北京'
all_data.loc[all_data['sh']==True,'city']='上海'
all_data.loc[all_data['gz']==True,'city']='广州'
all_data.loc[all_data['sz']==True,'city']='深圳'
#删除多余的数据
del all_data['bj']
del all_data['sh']
del all_data['sz']
del all_data['gz']
del all_data['location']

可以看到这里的loc[ ] 选取的数据是【bj】这一列的,但替换的却是【city】这一列的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pandas中文本数据的拆分和提取 的相关文章

  • 扭曲多种协议

    我希望为我正在从事的项目学习扭曲 该项目需要服务器响应 HTTP 请求以及通过 TCP 连接的其他协议 Twisted能够同时处理多种协议吗 我想使用 Twisted Web 来帮助处理 HTTP 但同时需要响应其他端口上的 TCP 连接
  • 如何向 pandas.DataFrame 的子类添加属性?

    我想向 DataFrame 的子类添加属性 但出现错误 gt gt gt import pandas as pd gt gt gt class Foo pd DataFrame def init self self bar None gt
  • Python 正则表达式从文本中提取域

    我有以下正则表达式 r a zA Z0 9 a zA Z0 9 61 a zA Z0 9 a zA Z 2 6 当我将其应用于文本字符串时 比方说 这是 www website1 com 这是 website2 com 我得到 www we
  • 绘制对数轴

    我想使用 matplotlib 绘制一张带有一个对数轴的图 我一直在阅读文档 但无法弄清楚语法 我知道这可能很简单 scale linear 在情节争论中 但我似乎无法正确理解 示例程序 import pylab import matplo
  • 打开文件路径在 python 中不起作用[重复]

    这个问题在这里已经有答案了 我正在编写一个数据库程序 personica 是我的测试主题 我通常在文件路径的位置有一个变量 但出于测试和演示的目的 我只有一个字符串 在我的计算机上的这个确切位置有一个文本文件 顺便说一句 因为我很偏执 所以
  • python:numpy 运行脚本两次

    当我将 numpy 导入到 python 脚本中时 该脚本会执行两次 有人可以告诉我如何阻止这种情况 因为我的脚本中的所有内容都需要两倍的时间 这是一个例子 usr bin python2 from numpy import print t
  • R.scale() 和 sklearn.preprocessing.scale() 之间的区别

    我目前正在将数据分析从 R 转移到 Python 当在 R 中缩放数据集时 我将使用 R scale 根据我的理解 它将执行以下操作 x mean x sd x 为了替换该函数 我尝试使用 sklearn preprocessing sca
  • 如何使用Peewee查询多个相似的数据库?

    我遇到了使用 Peewee 查询多个数据库的问题 我有 2 个现有的 mysql 数据库 让我们将它们命名为 A 和 B 结构相似 因为它是两个 Bugzilla 数据库 我使用 Pwiz 生成模型 modelsA py 和 modelsB
  • 使用 python boto3 管理 Route53 中具有多个 IP 的 A 记录

    我的route53中有一条A记录 后面有多个IP 例子 A record dummy xyz com 点IPs 1 1 1 1 2 2 2 2 和 3 3 3 3路由策略 Simple 我使用下面的代码来更新单个 IP 的记录 Change
  • 如何在 Django 中像应用程序一样从配置中注册 Flask 蓝图?

    如何从我的配置中注册 Flask 蓝图 就像 Django 中的应用程序一样 我想在配置文件中定义蓝图 它将自动注册 config py BLUEPRINTS news files 实际上我一直在一个暂定名为的项目中勾勒出类似的东西臀部口袋
  • Python3 - 如何将字符串转换为十六进制

    我正在尝试将字符串逐个字符转换为十六进制 但我无法在Python3中弄清楚它 在较旧的 python 版本中 我的以下内容有效 test This is a test for c in range 0 len test print 0x s
  • django-allauth:电子邮件确认

    我已经设置了 django allauth 并在新用户注册时使用电子邮件确认 效果很好 但在确认电子邮件中 我得到 Hello from example com You re receiving this e mail because us
  • NumPy 根据另一个数组中的值对第三个数组中的每个匹配元素求和一个数组

    我有两个 numpy 数组 一个包含值 另一个包含每个值类别 values np array 1 2 3 4 5 6 7 8 9 10 valcats np array 101 301 201 201 102 302 302 202 102
  • 如何仅在按下某个键时触发鼠标单击?在Python中

    我想制作一个程序 或者当我单击某个键时 鼠标会自动单击 只要我单击该键 如果我不单击该键 它就会停止 我不希望只在触摸按键一次时才发生点击 而是只要按住按键就发生点击 也可以像雷蛇突触鼠标一样按下鼠标左键触发点击 任何想法 EDIT 1 这
  • Django - 渲染到字符串无法加载 CSS

    我正在尝试使用 Django 1 8 render to string 通过管理命令将 html 转换为 pdf 而不是使用 View request 以下代码可以将模板转换为 pdf 但它无法将 CSS 加载到模板中 def html t
  • 检查图像中是否有太薄的区域

    我正在尝试验证雕刻机的黑白图像 更多的是剪贴画图像 不是照片 我需要考虑的主要事情之一是区域的大小 或线条的宽度 因为机器无法处理太细的线条 所以我需要找到比给定阈值更细的区域 以此图为例 竖琴的琴弦可能太细而无法雕刻 我正在阅读有关 Ma
  • 使用 Python 获取 Youtube 数据

    我正在尝试学习如何分析网络上可用的社交媒体数据 我从 Youtube 开始 from apiclient errors import HttpError from outh2client tools import argparser fro
  • 如何从 PyObject 获取指向字符串的 char*

    我怎样才能得到一个char from a PyObject它指向一个字符串 例如 这是 python 脚本 Test Connect 272 22 20 65 1234 这是 C 代码 static PyObject Connect PyO
  • 如何将动态数据传递给装饰器

    我正在尝试编写一个基本的 CRUD 控制器类来执行以下操作 下列的 class BaseCrudController model field validation template dir expose self template dir
  • 收到 Python 错误“来自:无法读取 /var/mail/Bio”

    我正在运行一个 bio python 脚本 这会导致以下错误 from can t read var mail Bio 由于我的脚本与邮件没有任何关系 我不明白为什么我的脚本在 var mail 中查找 这里似乎有什么问题 我怀疑这会有帮助

随机推荐

  • 自制带串口的J-Link OB 072

    自制带串口的J Link OB 072 普通的三线J link不带串口 使用起来比较麻烦 于是找资料自制了一个J Link OB 072 主芯片是stm32f072c8t6 带串口 使用方便 先上图 自带信仰加持 一遍调通 急急如律令 依然
  • vue 高德地图添加放大缩小地图、转盘工具

    新建文件 amap vue
  • Guided Diffusion/Diffusion Models Beat GANs on Image Synthesis (Paper reading)

    Guided Diffusion Diffusion Models Beat GANs on Image Synthesis Paper reading Prafulla Dhariwal OpenAI NeurlPS2021 Cited
  • JavaScript——大数组的合并问题及不同数组合并方法的探究

    JavaScript 大数组的合并问题及不同数组合并方法的探究 最近在处理模型数据的时候出现了一个问题 当合并不同模型的vertex等数据的时候 从网上查了查都说Array prototype push 这个好 结果我使用了这个方法却报错了
  • VUE的项目中怎样修改浏览器窗口的 LOGO

    vue项目如何修改上图浏览器的标题栏的图标 在public目录中的index html添加如下代码 注意logo svg是图片 图片位置在public目录下
  • 【直接收藏】前端 VUE 高阶面试题(一)

    1 说说vue动态权限绑定渲染列表 权限列表渲染 首先请求服务器 获取当前用户的权限数据 比如请求 this http get rights list 获取到权限数据之后 在列表中使用v if v if else的组合来展示不同的内容
  • 性能测试常见问题分析

    性能测试常见问题分析 1 请你个人描述一下性能测试的意义和作用 说出因性能不良造成的质量事故 2 如何进行性能测试 请说出整体的性能测试流程 a 分析测试范围 测试对象 如频繁使用的功能 频繁调用的接口 大量数据库读写操作多的功能 大量读写
  • 信息组织川大972

    网络信息组织 1 网络信息环境 1 1 网络发展的三个阶段 2 语义网信息组织 2 1 万维网与语义网 2 2 语义网技术架构 2 3 本体 2 4 关联数据 2 5 网站信息架构 3 Web2 0信息组织方法 3 1 标签法 3 2 Wi
  • 多元Huffman编码问题

    题目链接 题意 最多可以让k堆合并 每一次合并的花费为河合并堆的数量 问最多和最少的花费 题解 最少的花费一定是每次合并的堆数尽可能多 这样我们就会减少前面已经合并的堆的重复计算 所以 每次合并k堆时最少 每次合并2堆时最大 另外 最少的时
  • [WTL] STLport安装指南

    STLport安装指南STLport 4 6 是完全兼容ANSI C 标准的类库 This distribution contains STLport sources only no binaries To use STLport iost
  • Word文件删除后怎么恢复?好用的恢复方法分享

    Word文件删除后怎么恢复 在工作和学习的过程中 我们难免会遇到丢失数据的情况 比如有时候不小心删除了Word文件 或者Word文件在操作过程中意外卡顿导致丢失 有什么好方法恢复呢 下面就一起来了解下 遇到Word文件数据丢失不要慌张 首先
  • Java项目的开发流程

    一个java开发项目过程 1 项目启动 1 项目组成立 公司成员 客户成员 2 制定项目预期目标 3 制定项目计划周期 4 建立好项目组成员沟通机制 2 需求调研 1 创建调研计划 协调调研时间 2 收集客户资料 获取客户需求 所有的资料都
  • Redis缓存雪崩、穿透、击穿原因分析和解决方案,附Redis管道使用技巧

    先给大家附上其他几篇文章 感兴趣的自行开车导航 Redis过期策略和持久化机制全面揭秘 教你如何合理配置 深入浅出Redis 一 从版本特性到数据类型到线程模型 带你了解Redis的核心特性和应用场景 一次redis OOM问题分析解决 r
  • 阿里云ECS漏洞修复简单办法

    阿里云的安全检测功能会每天检测主机上的漏洞 然后短信推送 让你试用漏洞修复功能 或购买修复功能 其实不需要购买 在主机上执行 apt upgrade 或者 yum upgrade 就自动修复了 其实就是更新软件包 更新内核 然后重启就可以了
  • LeetCode-738

    738 单调递增的数字 给定一个非负整数 N 找出小于或等于 N 的最大的整数 同时这个整数需要满足其各个位数上的数字是单调递增 当且仅当每个相邻位数上的数字 x 和 y 满足 x lt y 时 我们称这个整数是单调递增的 Example
  • 油盐微服务——负载均衡Ribbon

    文章目录 客户端负载均衡 RestTemplate详解 Spring Cloud Ribbon 是一个基于http和tcp的客户端 负载均衡工具 它 不需要像服务注册中心那样 独立部署 它几乎存在于每一个Spring Cloud构建的微服务
  • ubuntu16.04 从源码安装opencv4.0 支持anaconda3.5

    step1 安装依赖库 sudo apt get install build essential cmake pkg config sudo apt get install libjpeg8 dev libtiff5 dev libjasp
  • 【解析与反思】leetcode 1219. 黄金矿工 DFS 解法(C++)

    目录 前言 一 原题 二 基本思想 三 代码实现 四 代码优化 五 Dijktra 算法思考 前言 本文采用 DFS 算法求解问题 针对提交过程中遇到了超时的问题做出了分析和调试 供大家参考 一 原题 你要开发一座金矿 地质勘测学家已经探明
  • js_moment

    js 一 moment js Moment js是一个轻量级的JavaScript时间库 它方便了日常开发中对时间的操作 提高了开发效率 日常开发中 通常会对时间进行下面这几个操作 比如获取时间 设置时间 格式化时间 比较时间等等 下面就是
  • pandas中文本数据的拆分和提取

    本文主要分享文本数据的拆分 提取合并 为下一步可视化分析做好准备 数据来源于boss与拉勾网数据分析岗位的招聘信息 拉勾网的爬取方法见我的 Python selenium beautifulsoup 登录爬取拉勾网 登录爬取拉勾网2 0 P