Pandas进阶:文本处理

引言

文本的主要两个类型是stringobject。如果不特殊指定类型为string,文本类型一般为object

文本的操作主要是通过访问器str 来实现的,功能十分强大,但使用前需要注意以下几点。

  1. 访问器只能对Series数据结构使用。 除了常规列变量df.col以外,也可以对索引类型df.Indexdf.columns使用

  2. 确保访问的对象类型是字符串str类型。 如果不是需要先astype(str)转换类型,否则会报错

  3. 访问器可以多个连接使用。 如df.col.str.lower().str.upper(),这个和Dataframe中的一行操作是一个原理

下面正式介绍文本的各种骚操作,基本可以涵盖日常95%的数据清洗需要了,一共 8 个场景。

图片

以下操作均基于下面的数据:

import pandas as pd
import numpy as np

df = pd.DataFrame({'name':['jordon', 'MIKE', 'Kelvin', 'xiaoLi', 'qiqi','Amei'],
                   'Age':[18, 30, 45, 23, 45, 62],
                   'level':['high','Low','M','L','middle',np.nan],
                   'Email':['jordon@sohu.com','Mike@126.cn','KelvinChai@gmail.com','xiaoli@163.com',np.nan,'amei@qq.com']})
--------------------------------------------
   name   Age   level    Email
0  jordon  18    high    jordon@sohu.com
1  MIKE    30     Low    Mike@126.cn
2  Kelvin  45       M    KelvinChai@gmail.com
3  xiaoLi  23       L    xiaoli@163.com
4  qiqi    45  middle    NaN
5  Amei    62     NaN    amei@qq.com

1、文本格式

大小写变换

# 字符全部变成小写
s.str.lower()
# 字符全部大写
s.str.upper()
# 每个单词首字母大写
s.str.title()
# 字符串第一个字母大写
s.str.capitalize()
# 大小写字母转换
s.str.swapcase()

上面用法都比较简单,不逐一举例,这里举一个对columns变成小写的例子。

df.columns.str.lower()
--------------------------------------------------------
Index(['name', 'age', 'level', 'email'], dtype='object')

格式判断

下面均为判断操作,因此返回布尔值。

s.str.isalpha # 是否为字母
s.str.isnumeric # 是否为数字0-9
s.str.isalnum # 是否由字母和数字组成
s.str.isupper # 是否为大写
s.str.islower # 是否为小写
s.str.isdigit # 是否为数字

对齐

# 居中对齐,宽度为8,其余用’*’填充
s.str.center(, fillchar='*')
# 左对齐,宽度为8,其余用’*’填充
s.str.ljust(8, fillchar='*')
# 右对齐,宽度为8,其余用’*’填充
s.str.rjust(8, fillchar='*')
# 自定义对齐方式,参数可调整宽度、对齐方向、填充字符
s.str.pad(width=8, side='both',fillchar='*')
# 举例
df.name.str.center(8, fillchar='*')
-------------
0    *jordon*
1    **MIKE**
2    *Kelvin*
3    *xiaoLi*
4    **qiqi**
5    **Amei**

计数和编码

s.str.count('b') # 字符串种包括指定字母的数量
s.str.len() # 字符串长度
s.str.encode('utf-8') # 字符编码
s.str.decode('utf-8') # 字符解码

2、文本拆分

通过使用split方法可以某个指定的字符作为分割点拆分文本。其中,expand参数可以让拆分的内容展开,形成单独的列,n参数可以指定拆分的位置来控制形成几列。

下面将email变量按照@进行拆分。

# 使用方法
s.str.split('x', expand=True, n=1)
# 举例
df.Email.str.split('@')
----------------------------
0         [jordon, sohu.com]
1            [Mike, 126.cn]
2    [KelvinChai, gmail.com]
3          [xiaoli, 163.com]
4                        NaN
5             [amei, qq.com]
# expand可以让拆分的内容扩展成单独一列
df.Email.str.split('@' ,expand=True)
----------------------------
   0          1
0  jordon      sohu.com
1  Mike        126.cn
2  KelvinChai  gmail.com
3  xiaoli      163.com
4  NaN         NaN
5  amei        qq.com

更复杂的拆分可以借助正则表达式,比如想同时通过@.进行拆分,那么可以这样实现。

df.Email.str.split('\@|\.',expand=True)
----------------------------
   0           1      2
0  jordon      sohu   com
1  Mike        126    cn
2  KelvinChai  gmail  com
3  xiaoli      163    com
4  NaN         NaN    NaN
5  amei        qq     com

3、文本替换

文本替换有几种方法:replaceslice_replacerepeat

replace替换

replace方法是最常用的替换方法,参数如下:

  • pal:为被替代的内容字符串,也可以为正则表达式

  • repl:为新内容字符串,也可以是一个被调用的函数

  • regex:用于设置是否支持正则,默认是True

# 将email种的com都替换为cn
df.Email.str.replace('com','cn')
------------------------
0         jordon@sohu.cn
1            Mike@126.cn
2    KelvinChai@gmail.cn
3          xiaoli@163.cn
4                    NaN
5             amei@qq.cn

更复杂一点的,比如将旧内容写成正则表达式

#将@之前的名字都替换成xxx
df.Email.str.replace('(.*?)@','xxx@')
------------------
0     xxx@sohu.com
1       xxx@126.cn
2    xxx@gmail.com
3      xxx@163.com
4              NaN
5       xxx@qq.com

或者将新内容写成被调用的函数

df.Email.str.replace('(.*?)@', lambda x:x.group().upper())
-------------------------
0         JORDON@sohu.com
1             MIKE@126.cn
2    KELVINCHAI@gmail.com
3          XIAOLI@163.com
4                     NaN
5             AMEI@qq.com

切片替换

slice_replace通过切片的方式实现替换,通过切片可以保留或者删除指定的字符,参数如下。

  • start:起始位置

  • stop:结束位置

  • repl:要替换用的新内容

start切片位置之后和stop切片位置之前进行替换,如果没有设置stop,那么start之后全部进行替换,同理如果没设置start,那么stop之前全部进行替换。

df.Email.str.slice_replace(start=1,stop=2,repl='XX')
-------------------------
0         jXXrdon@sohu.com
1             MXXke@126.cn
2    KXXlvinChai@gmail.com
3          xXXaoli@163.com
4                      NaN
5             aXXei@qq.com

重复替换

repeat可以实现重复替换的功能,参数repeats设置重复的次数。

df.name.str.repeat(repeats=2)
-------------------------
0    jordonjordon
1        MIKEMIKE
2    KelvinKelvin
3    xiaoLixiaoLi
4        qiqiqiqi
5        AmeiAmei

4、文本拼接

文本拼接通过cat方法实现,参数:

  • others: 需要拼接的序列,如果为None不设置,就会自动把当前序列拼接为一个字符串

  • sep: 拼接用的分隔符

  • na_rep: 默认不对空值处理,这里设置空值的替换字符。

  • join: 拼接的方向,包括leftrightouterinner,默认为left

主要有以下几种拼接方式。

1. 将单个序列拼接为一个完整字符串

如上所述,当没有设置ohters参数时,该方法会将当前序列合并为一个新的字符串。

df.name.str.cat()
-------------------------------
'jordonMIKEKelvinxiaoLiqiqiAmei'
# 设置sep分隔符为`-`
df.name.str.cat(sep='-')
-------------------------------
'jordon-MIKE-Kelvin-xiaoLi-qiqi-Amei'
# 将缺失值赋值为`*`
df.level.str.cat(sep='-',na_rep='*')
-----------------------
'high-Low-M-L-middle-*'

2. 拼接序列和其他类列表型对象为新的序列

下面先将name列和*列拼接,再将level列拼接,形成一个新的序列。

# str.cat多级连接实现多列拼接
df.name.str.cat(['*']*6).str.cat(df.level)
----------------
0    jordon*high
1       MIKE*Low
2       Kelvin*M
3       xiaoLi*L
4    qiqi*middle
5            NaN
# 也可以直接多列拼接
df.name.str.cat([df.level,df.Email],na_rep='*')
--------------------------------
0      jordonhighjordon@sohu.com
1             MIKELowMike@126.cn
2    KelvinMKelvinChai@gmail.com
3          xiaoLiLxiaoli@163.com
4                    qiqimiddle*
5               Amei*amei@qq.com

将一个序列与多个对象拼接为一个新的序列

5、文本提取

文本提取主要通过extract来实现的。

extract参数:

  • pat: 通过正则表达式实现一个提取的pattern

  • flags: 正则库re中的标识,比如re.IGNORECASE

  • expand: 当正则只提取一个内容时,如果expand=True会展开返回一个DataFrame,否则返回一个Series

# 提取email中的两个内容
df.Email.str.extract(pat='(.*?)@(.*).com')
--------------------
   0          1
0  jordon      sohu
1  vMike      NaN
2  KelvinChai  gmail
3  xiaoli      163
4  NaN         NaN
5  amei        qq

6、文本查询

通过findfindall两个方法实现。

find 参数很简单,直接输入要查询的字符串即可,返回在原字符串中的位置,没查询到结果返回-1

df['@position'] = df.Email.str.find('@')
df[['Email','@position']]
-------------------------------------
    Email                   @position
0   jordon@sohu.com         6.0
1   Mike@126.cn             4.0
2   KelvinChai@gmail.com    10.0
3   xiaoli@163.com          6.0
4   NaN                     NaN
5   amei@qq.com             4.0

上面示例返回@在email变量中的位置。

另外一个查找方法是findall

findall参数:

  • pat: 要查找的内容,支持正则表达式

  • flag: 正则库re中的标识,比如re.IGNORECASE

findallfind的区别是支持正则表达式,并返回具体内容。这个方法有点类似extract,也可以用于提取,但不如extract方便。

df.Email.str.findall('(.*?)@(.*).com')
--------------------------
0         [(jordon, sohu)]
1                       []
2    [(KelvinChai, gmail)]
3          [(xiaoli, 163)]
4                      NaN
5             [(amei, qq)]

上面示例返回正则查找的两个部分,并以元组列表的形式出现。

7、文本包含

文本包含通过contains方法实现,返回布尔值,一般和loc查询功能配合使用,参数:

  • pat: 匹配字符串,支持正则表达式

  • case: 是否区分大小写,True表示区别

  • flags: 正则库re中的标识,比如re.IGNORECASE

  • na: 对缺失值填充

  • regex: 是否支持正则,默认True支持

df.Email.str.contains('jordon|com',na='*')
----------
0     True
1    False
2     True
3     True
4        *
5     True
# 
df.loc[df.Email.str.contains('jordon|com', na=False)]
------------------------------------------
   name    Age  level  Email                 @position
0  jordon  18   high   jordon@sohu.com        6.0
2  Kelvin  45   M      KelvinChai@gmail.com   10.0
3  xiaoLi  23   L      xiaoli@163.com         6.0
5  Amei    62   NaN    amei@qq.com            4.0

这里需要注意一下,如果和loc配合使用,注意不能有缺失值,否则会报错。可以通过设置na=False忽略缺失值完成查询。

8、文本的虚拟变量

get_dummies可以将一个列变量自动生成虚拟变量(哑变量),这种方法在特征衍生中经常使用。

df.name.str.get_dummies()
-------------------------------
  Amei Kelvin MIKE jordon qiqi xiaoLi
0   0     0     0     1     0     0
1   0     0     1     0     0     0
2   0     1     0     0     0     0
3   0     0     0     0     0     1
4   0     0     0     0     1     0
5   1     0     0     0     0     0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/209186.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

对el-select封装成组件使用

效果与直接使用el-select一样&#xff0c;多处用el-select显得代码冗余就进行了封装 效果图&#xff1a; el-select封装&#xff1a; <template><div class"my-select"><el-selectv-model"person.modelValue":placeholder"placehold…

H5 Canvas 打飞机青春版

没事儿写写练习一下&#xff0c;说不准哪天就用到今天所用到的知识点了呢。 在线链接 https://linyisonger.github.io/H5.Examples/?name./053.%E9%A3%9E%E6%9C%BA%E5%A4%A7%E6%88%98.html 功能清单 循环滚动背景 矩形碰撞 随机生成敌人 飞机左右移动 苹果屏蔽长按 移动端屏…

京东数据运营-京东数据开放平台-鲸参谋10月粮油调味市场品牌店铺销售数据分析

鲸参谋监测的京东平台10月份料油调味市场销售数据已出炉&#xff01; 根据鲸参谋数据显示&#xff0c;今年10月份&#xff0c;京东平台粮油调味市场的销量将近4600万&#xff0c;环比增长约10%&#xff0c;同比降低约20%&#xff1b;销售额将近19亿&#xff0c;环比增长约4%&am…

(C++)三数之和--双指针法

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 算法原理 双指针法&#xff0c;不一定是说就要使用指针&#xff0c;只是一种形象的说法&#xff0c;在数组中&#xff0c;我们一般将数组下标当做指针。我们首先对数组进行排序&#xff0c;从左向右标定一个下标i&#xff0…

LED屏幕信息安全如何预防?

随着科技的不断进步&#xff0c;LED屏幕在我们生活和工作中扮演着越来越重要的角色&#xff0c;然而&#xff0c;随之而来的是信息安全面临的挑战。为了有效预防LED屏幕信息的泄露和被盗取&#xff0c;我们需要采取一系列的安全措施。以下是一些建议&#xff1a; 物理安全措施&…

中国毫米波雷达产业分析6——毫米波雷达行业发展展望

一、行业发展驱动力分析 &#xff08;一&#xff09;需求带动 当前&#xff0c;全球智能化变革浪潮正在汽车、交通、安防、工业、家居、健康监护等诸多产业蓬勃发展&#xff0c;创造了巨大的感知产品增量需求。 在汽车领域&#xff0c;毫米波雷达传感器作为一种非接触…

【无标题】mmocr在云服务器上

这里写目录标题 1、创建虚拟环境2、切换和退出conda虚拟环境3. 显示、复制&#xff08;克隆&#xff09;、删除虚拟环境4、删除环境安装指示中 cd进项目文件夹开始训练模型&#xff08;python XXX.py | tee record.txt 记录训练结果&#xff09;如何在Linux服务器上安装Anacond…

leetcode刷题详解—— 环形子数组的最大和

1. 题目链接&#xff1a;918. 环形子数组的最大和 2. 题目描述&#xff1a; 给定一个长度为 n 的环形整数数组 nums &#xff0c;返回 nums 的非空 子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开头相连呈环状。形式上&#xff0c; nums[i] 的下一个元素是 nums[(…

SAP 如何检查已安装的SAP UI5 版本

第一个方法是直接从FLP中查看 但是部分高版本的FLP中没有这个about&#xff0c; 那么在当前界面可以使用&#xff1a;CTRL ALT SHIFT S 查看当前版本 根据此版本&#xff0c;去进行你的UI5的开发吧

NodeJS(二):npm包管理工具、yarn、npx、pnpm工具等

目录 (一)npm包管理工具 1.了解npm 2.npm的配置文件 常见的配置属性 scripts属性*** 依赖的版本管理 3.npm安装包的细节 4.package-lock文件 5.npm install原理** 6.npm的其他命令 (二) 其他包管理工具 1.yarn工具 基本指令 2.cnpm工具 3.npx工具 (1)执行本地…

C++可表示的数(数组前面2个数的和)

void 可表示的数&#xff08;数组前面2个数的和&#xff09;() {int aa[]{1,2,3,4,5,6,7,8,9}, j 0, z 1, jj z, n 9, ge 0;string a "";while (j < n)//缘由https://bbs.csdn.net/topics/396063706?page1#post-410898529{if (jj < n)if (aa[j] aa[z] …

Android--Jetpack--Lifecycle详解

富贵本无根&#xff0c;尽从勤里得 一&#xff0c;定义 Lifecycle 是一个具备宿主生命周期感知能力的组件。它持有组件&#xff08;Activity/Fragment&#xff09;生命周期状态信息&#xff0c;并且允许其观察者监听宿主生命周期状态变化。 顾名思义&#xff0c;Lifecycle的主…

数据治理的具体应用

数据治理架构 图 13 描述的是公安数据治理框架&#xff0c;平台架构主要包括数据存储、数据计算、数据管理、数据应用这 4 个部分。 (1) 数据存储&#xff1a; 基于分布式的大数据存储平台&#xff0c;具有很强的存储能力和扩张能力&#xff1b; (2) 数据计算&#xff1a; …

目标检测——Faster R-CNN算法解读

论文&#xff1a;Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 作者&#xff1a;Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun 链接&#xff1a;https://arxiv.org/abs/1506.01497 代码&#xff1a;https://github.com/rbgirsh…

golang Pool实战与底层实现

使用的go版本为 go1.21.2 首先我们写一个简单的Pool的使用代码 package mainimport "sync"var bytePool sync.Pool{New: func() interface{} {b : make([]byte, 1024)return &b}, }func main() {for j : 0; j < 10; j {obj : bytePool.Get().(*[]byte) // …

Python 重要数据类型

目录 列表 序列操作 列表内置方法 列表推到式 字典 声明字典 字典基本操作 列表内置方法 字典进阶使用 字典生成式 附录 列表 在实际开发中&#xff0c;经常需要将一组&#xff08;不只一个&#xff09;数据存储起来&#xff0c;以便后边的代码使用。列表就是这样的…

JNPF低代码平台详解 -- 系统架构

目录 一、技术介绍 技术架构 二、设计原理 三、界面展示 1.代码生成器 2.工作流程 3.门户设计 4.大屏设计 5.报表设计 6.第三方登录 7.多租户实现 8.分布式调度 9.消息中心 四、功能框架 JNPF低代码是一款新奇、实用、高效的企业级软件开发工具&#xff0c;支持企…

柱状展示当中 ,如何给每个位置加多个项的办法

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>双柱修改</title> <script src"https://cdn.staticfile.org/Chart.js/3.9.1/chart.js"></script> </head> <body><canvas i…

分治算法——912. 排序数组

文章目录 &#x1f348;1. 题目&#x1f34c;2. 算法原理&#x1f34f;3. 代码实现 &#x1f348;1. 题目 题目链接&#xff1a;912. 排序数组 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 示例 1&#xff1a; 输入&am…

【Vulnhub 靶场】【Funbox: Lunchbreaker】【简单】【20210522】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/funbox-lunchbreaker,700/ 靶场下载&#xff1a;https://download.vulnhub.com/funbox/FunboxLunchbreaker.ova 靶场难度&#xff1a;简单 发布日期&#xff1a;2021年05月22日 文件大小&#xff1a;1.6 GB 靶…