python数据清洗系列之字符串处理详解


Posted in Python onFebruary 12, 2017

前言

数据清洗是一项复杂且繁琐(kubi)的工作,同时也是整个数据分析过程中最为重要的环节。有人说一个分析项目80%的时间都是在清洗数据,这听起来有些匪夷所思,但在实际的工作中确实如此。数据清洗的目的有两个,第一是通过清洗让数据可用。第二是让数据变的更适合进行后续的分析工作。换句话说就是有”脏”数据要洗,干净的数据也要洗。

在数据分析中,特别是文本分析中,字符处理需要耗费极大的精力,因而了解字符处理对于数据分析而言,也是一项很重要的能力。

字符串处理方法

首先我们先了解下都有哪些基础方法

python数据清洗系列之字符串处理详解

首先我们了解下字符串的拆分split方法

str='i like apple,i like bananer'
print(str.split(','))

对字符str用逗号进行拆分的结果:

['i like apple', 'i like bananer']

print(str.split(' '))

根据空格拆分的结果:

['i', 'like', 'apple,i', 'like', 'bananer']

print(str.index(','))
print(str.find(','))

两个查找结果都为:

12

找不到的情况下index返回错误,find返回-1

print(str.count('i'))

结果为:

4

connt用于统计目标字符串的频率

print(str.replace(',', ' ').split(' '))

结果为:

['i', 'like', 'apple', 'i', 'like', 'bananer']

这里replace把逗号替换为空格后,在用空格对字符串进行分割,刚好能把每个单词取出来。

除了常规的方法以外,更强大的字符处理工具费正则表达式莫属了。

正则表达式

在使用正则表达式前我们还要先了解下,正则表达式中的诸多方法。

python数据清洗系列之字符串处理详解

下面我来看下个方法的使用,首先了解下match和search方法的区别

str = "Cats are smarter than dogs"
pattern=re.compile(r'(.*) are (.*?) .*')
result=re.match(pattern,str)

for i in range(len(result.groups())+1):
 print(result.group(i))

结果为:

Cats are smarter than dogs
Cats
smarter

这种形式的pettern匹配规则下,match和search方法的的返回结果是一样的

此时如果把pattern改为

pattern=re.compile(r'are (.*?) .*')

match则返回none,search返回结果为:

are smarter than dogs
smarter

接下来我们了解下其他方法的使用

str = "138-9592-5592 # number"
pattern=re.compile(r'#.*$')
number=re.sub(pattern,'',str)
print(number)

结果为:

138-9592-5592

以上是通过把#号后面的内容替换为空实现提取号码的目的。

我们还可以进一步对号码的横杆进行替换

print(re.sub(r'-*','',number))

结果为:

13895925592

我们还可以用find的方法把找到的字符串打印出来

str = "138-9592-5592 # number"
pattern=re.compile(r'5')
print(pattern.findall(str))

结果为:

['5', '5', '5']

正则表达式的整体内容比较多,需要我们对匹配的字符串的规则有足够的了解,下面是具体的匹配规则。

python数据清洗系列之字符串处理详解

矢量化字符串函数

清理待分析的散乱数据时,常常需要做一些字符串规整化工作。

data = pd.Series({'li': '120@qq.com','wang':'5632@qq.com',
 'chen': '8622@xinlang.com','zhao':np.nan,'sun':'5243@gmail.com'})
print(data)

结果为:

python数据清洗系列之字符串处理详解

可以通过规整合的一些方法对数据做初步的判断,比如用contains 判断每个数据中是否含有关键词

print(data.str.contains('@'))

结果为:

python数据清洗系列之字符串处理详解

也可以对字符串进行分拆,把需要的字符串提取出来

data = pd.Series({'li': '120@qq.com','wang':'5632@qq.com',
     'chen': '8622@xinlang.com','zhao':np.nan,'sun':'5243@gmail.com'})
pattern=re.compile(r'(\d*)@([a-z]+)\.([a-z]{2,4})')
result=data.str.match(pattern) #这里用fillall的方法也可以result=data.str.findall(pattern)
print(result)

结果为:

chen [(8622, xinlang, com)]
li [(120, qq, com)]
sun [(5243, gmail, com)]
wang [(5632, qq, com)]
zhao NaN
dtype: object

此时加入我们需要提取邮箱前面的名称

print(result.str.get(0))

结果为:

python数据清洗系列之字符串处理详解

或者需要邮箱所属的域名

print(result.str.get(1))

结果为:

python数据清洗系列之字符串处理详解

当然也可以用切片的方式进行提取,不过提取的数据准确性不高

data = pd.Series({'li': '120@qq.com','wang':'5632@qq.com',
    'chen': '8622@xinlang.com','zhao':np.nan,'sun':'5243@gmail.com'})
print(data.str[:6])

结果为:

python数据清洗系列之字符串处理详解

最后我们了解下矢量化的字符串方法

python数据清洗系列之字符串处理详解

总结

以上就是python数据清洗之字符串处理的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
Python学习资料
Feb 08 Python
python 从远程服务器下载东西的代码
Feb 10 Python
在Python程序中操作MySQL的基本方法
Jul 29 Python
如何安装多版本python python2和python3共存以及pip共存
Sep 18 Python
对pandas里的loc并列条件索引的实例讲解
Nov 15 Python
Python3爬虫学习之MySQL数据库存储爬取的信息详解
Dec 12 Python
详解Python正则表达式re模块
Mar 19 Python
Python中的相关分析correlation analysis的实现
Aug 29 Python
给大家整理了19个pythonic的编程习惯(小结)
Sep 25 Python
Python中bisect的使用方法
Dec 31 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
Jan 16 Python
解决python的空格和tab混淆而报错的问题
Feb 26 Python
python中numpy基础学习及进行数组和矢量计算
Feb 12 #Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 #Python
python3制作捧腹网段子页爬虫
Feb 12 #Python
python日志记录模块实例及改进
Feb 12 #Python
Windows下Python2与Python3两个版本共存的方法详解
Feb 12 #Python
使用Python绘制图表大全总结
Feb 11 #Python
Python 绘图和可视化详细介绍
Feb 11 #Python
You might like
php+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
2007/03/07 PHP
php UBB 解析实现代码
2011/11/27 PHP
php实现统计邮件大小的方法
2013/08/06 PHP
使用php记录用户通过搜索引擎进网站的关键词
2014/02/13 PHP
php运行时动态创建函数的方法
2015/03/16 PHP
javascript优先加载笔记代码
2008/09/30 Javascript
为指定元素增加样式的js代码
2009/12/09 Javascript
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
JS构建页面的DOM节点结构的实现代码
2011/12/09 Javascript
javascript设计模式 接口介绍
2012/07/24 Javascript
jquery实现表格奇数偶数行不同样式(有图为证及实现代码)
2013/01/23 Javascript
使用JavaScript动态设置样式实现代码及演示动画
2013/01/25 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
JS使用eval解析JSON的注意事项分析
2015/11/14 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
BootStrap 导航条实例代码
2017/05/18 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
2017/12/25 jQuery
React倒计时功能实现代码——解耦通用
2020/09/18 Javascript
[08:44]和酒神一起战斗 DOTA2教你做大人
2014/03/27 DOTA
python逐行读取文件内容的三种方法
2014/01/20 Python
python根据文章标题内容自动生成摘要的实例
2019/02/21 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
在Python中使用MySQL--PyMySQL的基本使用方法
2019/11/19 Python
基于pytorch 预训练的词向量用法详解
2020/01/06 Python
opencv python图像梯度实例详解
2020/02/04 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
CSS3 box-shadow属性实例详解
2020/06/19 HTML / CSS
HTML5对手机页面长按会粘贴复制禁用的解决方法
2016/07/19 HTML / CSS
澳洲国民品牌乡村路折扣店:Country Road & Trenery Outlet
2018/04/19 全球购物
10条PHP编程习惯
2014/05/26 面试题
考博专家推荐信模板
2013/12/02 职场文书
幼儿园区域活动总结
2014/05/08 职场文书
庆祝国庆节标语
2014/10/09 职场文书
500字小学生检讨书
2015/02/19 职场文书
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers
python神经网络学习 使用Keras进行回归运算
2022/05/04 Python