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

作者:molearner 时间:2023-08-02 04:00:07 

前言

数据清洗是一项复杂且繁琐(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,字符串,数据
0
投稿

猜你喜欢

  • Django实现快速分页的方法实例

    2022-12-27 06:02:30
  • 如何做一个文本搜索?

    2010-07-12 19:00:00
  • 仿jQuery的siblings效果的js代码

    2024-04-28 09:36:34
  • 网页特效文字之—银箔字

    2013-08-07 00:21:39
  • PHP文件运行步骤以及数据库的连接代码

    2023-05-25 08:32:51
  • ASP程序与SQL存储过程结合使用详解

    2011-03-25 10:50:00
  • 利用python对Excel中的特定数据提取并写入新表的方法

    2023-09-17 16:03:10
  • Django项目中用JS实现加载子页面并传值的方法

    2022-07-05 00:18:28
  • PyCharm安装配置Qt Designer+PyUIC图文教程

    2022-10-21 08:44:46
  • 理清mysql外链的含义和命令

    2010-03-09 15:55:00
  • Python获取指定网段正在使用的IP

    2022-04-22 23:49:27
  • Python爬虫框架NewSpaper使用详解

    2022-06-03 06:20:26
  • 小白入门篇使用Python搭建点击率预估模型

    2021-02-09 20:49:04
  • python实现录屏功能(亲测好用)

    2022-01-12 19:54:34
  • 详解数据库语言中的null值

    2024-01-15 02:50:29
  • django使用LDAP验证的方法示例

    2022-11-22 12:54:47
  • 使用IDEA回滚某次提交的代码步骤

    2023-06-21 03:15:28
  • Bootstrap源码解读按钮(5)

    2023-08-23 01:16:51
  • PHP实现搜索相似图片

    2024-05-03 15:52:53
  • Python 读写 Matlab Mat 格式数据的操作

    2023-08-23 01:21:12
  • asp之家 网络编程 m.aspxhome.com