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数据预处理之将类别数据转换为数值的方法
Jul 05 Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 Python
判断python字典中key是否存在的两种方法
Aug 10 Python
opencv与numpy的图像基本操作
Mar 08 Python
Python网络爬虫之爬取微博热搜
Apr 18 Python
python实现websocket的客户端压力测试
Jun 25 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
Aug 23 Python
关于sys.stdout和print的区别详解
Dec 05 Python
Python tkinter界面实现历史天气查询的示例代码
Aug 23 Python
python处理json数据文件
Apr 11 Python
python创建字典及相关管理操作
Apr 13 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 curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
2015/11/30 PHP
PHP从尾到头打印链表实例讲解
2018/09/27 PHP
php防止表单重复提交实例讲解
2019/02/11 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
锋利的jQuery 要点归纳(三) jQuery中的事件和动画(下:动画篇)
2010/03/24 Javascript
jquery键盘事件使用介绍
2011/11/01 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
在linux中使用包管理器安装node.js
2015/03/13 Javascript
JavaScript中的getTimezoneOffset()方法使用详解
2015/06/10 Javascript
介绍JavaScript中Math.abs()方法的使用
2015/06/14 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
AngularJS入门教程二:在路由中传递参数的方法分析
2017/05/27 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
教你5分钟学会用requirejs(必看篇)
2017/07/25 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
2018/05/16 Javascript
jQuery实现的简单日历组件定义与用法示例
2018/12/24 jQuery
[55:23]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python全局变量操作详解
2015/04/14 Python
Python聊天室程序(基础版)
2018/04/01 Python
django自带的server 让外网主机访问方法
2018/05/14 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
2018/10/18 Python
解决python运行启动报错问题
2020/06/01 Python
python中如何写类
2020/06/29 Python
汉米尔顿手表官网:Hamilton
2020/09/13 全球购物
weblogic面试题
2016/03/07 面试题
生日寿宴答谢词
2014/01/19 职场文书
2015年创先争优工作总结
2015/05/23 职场文书
大学军训心得体会800字
2016/01/11 职场文书
Mysql Show Profile
2021/04/05 MySQL
《吸血鬼:避世 血猎》官宣4.27发售 系列首款大逃杀
2022/04/03 其他游戏
Java字符缓冲流BufferedWriter
2022/04/09 Java/Android
mysql查找连续出现n次以上的数字
2022/05/11 MySQL
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL