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使用htpasswd实现基本认证授权的例子
Jun 10 Python
使用Python发送邮件附件以定时备份MySQL的教程
Apr 25 Python
Python3.6日志Logging模块简单用法示例
Jun 14 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
May 10 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
Jul 25 Python
使用 Django Highcharts 实现数据可视化过程解析
Jul 31 Python
Python Selenium 之数据驱动测试的实现
Aug 01 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
Oct 12 Python
python 已知三条边求三角形的角度案例
Apr 12 Python
Python Dataframe常见索引方式详解
May 27 Python
Python编程编写完善的命令行工具
Sep 15 Python
Pygame Time时间控制的具体使用详解
Nov 17 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 新手入门教程
2009/08/03 PHP
解析zend studio中直接导入svn中的项目的方法步骤
2013/06/21 PHP
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
网页图片延时加载的js代码
2010/04/22 Javascript
js实现拉伸拖动iframe的具体代码
2013/08/03 Javascript
JavaScript中prototype为对象添加属性的误区介绍
2013/10/15 Javascript
javascript中apply、call和bind的使用区别
2016/04/05 Javascript
深入浅析JS的数组遍历方法(推荐)
2016/06/15 Javascript
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
2017/07/19 Javascript
微信小程序媒体组件详解(视频,音乐,图片)
2017/09/19 Javascript
通过一个简单的例子学会vuex与模块化
2017/11/22 Javascript
JS实现简单获取最近7天和最近3天日期的方法
2018/04/18 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
django使用channels2.x实现实时通讯
2018/11/28 Javascript
[01:11:37]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第一场 11.19
2020/11/19 DOTA
Python使用ntplib库同步校准当地时间的方法
2016/07/02 Python
Python简单操作sqlite3的方法示例
2017/03/22 Python
Django 实现购物车功能的示例代码
2018/10/08 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
tensorflow 变长序列存储实例
2020/01/20 Python
基于Python词云分析政府工作报告关键词
2020/06/02 Python
如何基于Python和Flask编写Prometheus监控
2020/11/25 Python
在线课程:Skillshare
2019/04/02 全球购物
学期研究性学习个人的自我评价
2014/01/09 职场文书
部队学习十八大感言
2014/01/11 职场文书
2014全国两会学习心得体会1000字
2014/03/10 职场文书
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
个人公开承诺书
2014/03/28 职场文书
低碳生活倡议书
2014/04/14 职场文书
员工考勤管理制度
2015/08/06 职场文书
委托开发合同书(标准版)
2019/08/07 职场文书
win10安装配置nginx的过程
2021/03/31 Servers
JavaScript中的宏任务和微任务详情
2021/11/27 Javascript
《王国之心》迎来了发售的20周年, 野村哲发布贺图
2022/04/11 其他游戏
WIN10使用IIS部署ftp服务器详细教程
2022/08/05 Servers