【Python自动化Excel】Python与pandas字符串操作
Python之所以能够成为流行的数据分析语言,有一部分原因在于其简洁易用的字符串处理能力。
Python的字符串对象封装了很多开箱即用的内置方法,处理单个字符串时十分方便;对于Excel、csv等表格文件中整列的批量字符串操作,pandas库也提供了简洁高效的处理函数,几乎与内置字符串函数一一对应。也就是说:
单个字符串处理,用Python内置的字符串方法;
表格整列的字符串处理,用pandas库中的字符串函数;
本文就以常用的数据处理需求,来对比使用以上两种方式的异同,从而加深对Python和pandas字符串操作的理解。(本文所有数据都是为了演示用的假数据,切勿当真!)
)
一、替换(去除空格)
场景:在问卷收集的姓名字段中,不少填写者会误输入空格,造成数据匹配不一致的问题。
Python
names = '刘 备、关 羽、 张 飞、赵 云、马 超、黄 忠'
names = names.replace(' ','')
print(names)
output
刘备、关羽、张飞、赵云、马超、黄忠
pandas
df['姓名'] = df['姓名'].str.replace(' ','')
output
二、分列
场景:在问卷收集数据的时候,多选题的数据往往是带有分隔符的。在分类汇总前往往需要按分隔符进行分列。
Python
hobbyStr = "足球┋排球┋羽毛球┋篮球"
hobbyList = hobbyStr.split('┋')
output
['足球', '排球', '羽毛球', '篮球']
pandas
# 利用split进行分列,expand = True 返回dataframe;expand=False返回Series
hobbyDf = df['爱好'].str.split('|', expand=True)
# 将hobbyDf 与 df安装索引合并
df2 = pd.merge(df, hobbyDf, how="left", left_index=True, right_index=True)
三、切片:截取数据
字符串是由一个个字符组成的序列,在Python中可以直接对字符串进行切片操作,来进行截取数据。
如“XX市四季家园二区22幢203室”,可以看作是下图中16个字符值组成的序列。而切片的语法是:
Python
addressStr = "XX市四季家园二区22幢203室"
print(f"城市:{addressStr[:3]}")
print(f"小区:{addressStr[3:9]}")
output
城市:XX市
小区:四季家园二区
pandas
提取城市名称,由于城市名称的字数相同,可以直接切片截取前三个。
df["城市"] = df["地址"].str[:3]
提取小区名,稍有点复杂。因为小区名称长度是不一样长的。可以利用字符串处理的天花板: 正则表达式。详细处理方法,见下文五、正则表达式示例1。
四、补齐数据
有时候,我们在电脑中按文件名排序的时候,你可能会遇到下面的情况:
在不同系统中,我们希望是按数值排序,但偏偏系统却是按字符排序的,如某些车载播放器中。比较好的解决方法就是在前面添加0,补齐数据位数。数据量大的时候,手动修改很麻烦,Python字符串处理的zfill()函数就可以解决这个问题。
Python
myStr = "1章节"
print(myStr.zfill(4)) # 整个字符串补齐到4位
output
01章节
pandas
df["新文件名"] = "第"+df["文件名"].str[1:].str.zfill(8)
配合os.rename()便可以批量重命名。关键代码如下
df.apply(lambda x: os.rename( path + x["文件名"], path + x["新文件名"]), axis=1)
五、正则表达式
遇到复杂的字符串处理需求时,Python有优势就可以体现出来了。因为python和pandas有一个超强的字符串处理武器:正则表达式。正则表达式可以匹配字符串的格式特点,如电子邮箱的地址格式、网址的地址格式、电话号码格式等。如何写好正则表达式,这是一门精深的学问,本文介绍几个正则表达式的常用案例,浅尝辄止。
注:Python默认不支持正则表达式语法,而pandas直接支持正则表达式语法,这里重点介绍pandas处理表格数据。
1.提取长度不一样的小区名
思路:
提取上面小区名,可以归纳一下地址中小区名的格式特点:
苏州市之后,幢号数字之前的中文字符。Series的str.extract(),可用正则从字符数据中抽取匹配的数据;
## 匹配中文字符的正则表达式: [\u4e00-\u9fa5]
pattern = r'苏州市([\u4e00-\u9fa5]+)[0-9]+幢'
df["小区"] = df["地址"].str.extract(pattern, expand=False)
2.提取几幢几室
思路:几幢几室,格式都是数字+幢和数字+室
数字可以用 [0-9]或\d来匹配;+表示1个或多个。
pattern = r'([0-9]+)幢'
df["幢号"] = df["地址"].str.extract(pattern, expand=False)
pattern = r'(\d+)室'
df["室号"] = df["地址"].str.extract(pattern, expand=False)
六、apply函数
apply 函数:可以对DateFrame进行逐行或逐列进行处理。
1.增加一列,将幢号按照奇偶数分类
将幢号为奇数的为A区,偶数的为B区
# 定义处理的函数,共apply函数调用,传入的参数为一个Series对象
def my_func(series):
if (series["幢号"]) % 2 != 0:
return "A区"
else:
return "B区"
df["幢号分类"] = df.apply(my_func, axis=1)
上述代码中apply函数,有两个参数
第一个参数:处理逻辑的函数名。主要传入名称,这里为 my_func;第二个参数: axis = 1,表示按列处理。即传入的是每一行的Series。
output
2.增加一列,字典映射
def my_func2(series):
# 映射字典,key为小区名,value为小区称号
my_dict = {
'吉祥如意家园': '最佳好运小区',
'科技村': '最佳科创小区',
'四季家园': '最佳风光小区',
'万象更新家园': '最佳风采小区',
}
# 每一行小区名称,切片截取至倒数第2个,即-2
nameKey = series['小区'][:-2]
return my_dict[nameKey]
df["小区称号"] = df.apply(my_func2, axis=1)
output
结语
本文演示的字符串操作:替换、分列、切片截取、补齐数据、正则表达式、apply()函数常见于数据分析的数据清洗环节,替换、分列、切片截取在Excel中也很容易实现,正则表达式可以说是Python处理复杂字符串问题的一大利器,apply()函数可以实现自定义函数处理表格型的数据,十分灵活、威力巨大。由于篇幅有限,正则表达式、apply()函数本文就点到为止,今后值得整理更多相关案例。
【Python自动化Excel】Python与pandas字符串操作的更多相关文章
- 【Python自动化Excel】pandas操作Excel的“分分合合”
话说Excel数据表,分久必合.合久必分.Excel数据表的"分"与"合"是日常办公中常见的操作.手动操作并不困难,但数据量大了之后,重复性操作往往会令人崩溃. ...
- 【Python自动化Excel】pandas处理Excel数据的基本流程
这里所说的pandas并不是大熊猫,而是Python的第三方库.这个库能干嘛呢?它在Python数据分析领域可是无人不知.无人不晓的.可以说是Python世界中的Excel. pandas库处理数据相 ...
- 【Python自动化Excel】pandas处理Excel的“分分合合”
话说Excel数据表,分久必合.合久必分.Excel数据表的"分"与"合"是日常办公中常见的操作.手动操作并不困难,但数据量大了之后,重复性操作往往会令人崩溃. ...
- Python自动化开发 - Python操作Memcached、Redis、RabbitMQ
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载. 它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速 ...
- Pandas字符串操作及实例应用
字符串操作 字符串对象方法 val = 'a,b, guido' val.split(',') ['a', 'b', ' guido'] pieces = [x.strip() for x in va ...
- Appium+python自动化8-Appium Python API
Appium+python自动化8-AppiumPython API 前言: Appium Python API全集,不知道哪个大神整理的,这里贴出来分享给大家. 1.contexts conte ...
- python自动化,使用unittest对界面操作,读取excel表格数据输入到页面查询结果,在把结果保存到另外一张excel中
# -*- coding: utf-8 -*-from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom ...
- python(二)——list、字典、字符串操作
列表——list 假设一种场景,想要存班里所有同学的名字,那应该拿什么存呢? 我们可以拿一个字符串去存,例如: stus = "s1,s2,s3,s4,s5……sn" 那我们要从里 ...
- Python自动化开发 - Python操作MySQL
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy 一.pymysql pymsql是Python中操作MySQL的模块,其使用方法和mysq ...
随机推荐
- 由浅入深--第一个MyBatis程序
话不多说,马上开始我们的第一个Mybatis程序: 第一个程序,当然要参考MyBatis的官网文档来搞,地址如下:https://mybatis.org/mybatis-3/zh/getting-st ...
- linux 提权防护
linux 用户提权 利用系统漏洞或者程序等方面的缺陷使一个低权限用户,获得他们原本不具有的权限或者得到root权限 下面介绍几种可能得到root访问权限的方式 1, 内核开发 防护:及时更新补丁 臭 ...
- JavaSE高级编程之多线程
4. 多线程 4.1 基本概念:程序.进程和线程 程序.进程和线程 程序:为了完成特定的任务,用某种语言编写的一组指令的集合.程序是一段静态的代码,静态对象. 进程:是程序的一次执行过程或正在运行的程 ...
- Mac下的平铺式桌面 - Yabai
Mac下的平铺式桌面 - Yabai 近来无事,凑着周末休息的时间,想折腾一下 Mac.很久之前就有朋友给我推荐过一款名为"Yabai"的平铺式桌面管理软件,今天,就折腾起来了. ...
- 小程序base64图片格式保存至手机相册
// 保存图片至相册 saveImg() { //获取文件管理器对象 const fs = wx.getFileSystemManager() //文件保存路径 const Imgpath = wx. ...
- vue 组件间的几种通信方式
Props配置 原理:通过props配置,进行父子组件间的通信,跨父子通信需要其他组件进行过渡. 使用: 传递方在标签中添加传递内容 <Son :newName="name" ...
- C++ STL vector扩容原理分析
扩容特点: 1)新增元素:vector通过一个连续的数组存放元素,如果集合已满,在新增数据的时候,就要分配一块更大的内存,将原来的数据复制过来,释放之前的内存,在插入新增的元素: 2)对vector的 ...
- 01 简介 如何高效的学习Java
JavaSE 千寻简学习笔记 简介 TIOBE:编程语言排行榜 官网:https://hellogithub.com/report/tiobe/ 如何高效的学习Java 多写(代码)多写(笔记)多写( ...
- 常见的Socket网络异常场景分析
原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 在目前微服务的背景下,网络异常越来越常见了,而有一些网络异常非常模糊,理解什么情况下会导致什么异常,还是有一定难度 ...
- 『现学现忘』Docker基础 — 27、Docker镜像的commit操作
目录 1.commit命令作用 2.commit命令说明 3.示例演示 1.commit命令作用 在运行的容器中,并在镜像的基础上做了一些修改,我们希望保存起来,封装成一个新的镜像,方便我们以后使用, ...