Pandas玩转文本处理

这篇具有很好参考价值的文章主要介绍了Pandas玩转文本处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数据处理,也是风控非常重要的一个环节,甚至说是模型成败的关键环节。因此,娴熟简洁的数据处理技巧,是提高建模效率和建模质量的必要能力。

 向量化操作的概述

对于文本数据的处理(清洗),是现实工作中的数据时不可或缺的功能,在这一节中,我们将介绍Pandas的字符串操作。Python内置一系列强大的字符串处理方法,但这些方法只能处理单个字符串,处理一个序列的字符串时,需要用到for循环。

那么,有没有办法,不用循环就能同时处理多个字符串呢,Pandas的向量化操作(vectorized string operation)就提供了这样的方法。Pandas为可能存在字符串的Series和Index对象提供了str属性,不仅能够进行向量化操作,还能够处理缺失值。

向量化的操作使我们不必担心数组的长度和维度,只需要关系操作功能,尤为强大的是,除了支持常用的字符串操作方法,还集成了正则表达式的大部分功能,这使得pandas在处理字符串列时,具有非常大的魔力。

例如,要计算每个单词中‘a’的个数,下面一行代码就可以搞定,非常高效

s = pd.Series(['amazon','alibaba','baidu'])
s.str.count('a')
0    2
1    3
2    1

假如用内置的字符串函数进行操作,需要进行遍历,且Python原生的遍历操作无法处理缺失值。

#用循环进行处理
s = ['amazon','alibaba','baidu']
[i.count('a') for i in s]
[2, 3, 1]

#存在缺失值时,打印报错
s = ['amazon','alibaba','baidu',None]
[i.count('a') for i in s]
AttributeError: 'NoneType' object has no attribute 'lower'

Pandas的向量化操作,能够正确的处理缺失值,无报错信息,如下

s = pd.Series(['amazon','alibaba','baidu',None])
s.str.count('a')
Out[36]: 
0    2.0
1    3.0
2    1.0
3    NaN
dtype: float64

通过上面的例子,对向量化进行简单总结,向量化是一种同时操作整个数组而不是一次操作一个元素的方法,下面从看看具体怎么应用。

 向量化的字符串处理方法

Pandas的字符串属的方法几乎包括了大部分Python的内置字符串方法(内置共有45个方法),下面将列举一些常见的方法的用法,例如上面的count()方法将会返回某个字符的个数,而len方法将会返回整个字符的长度。

Pandas玩转文本处理

Pandas玩转文本处理

Pandas玩转文本处理

下面选取部分函数举例,其他函数参考字符串模块

1、len()

import pandas as pd
import numpy as np 
 
s = pd.Series(['amazon','alibaba','Baidu'])
s.str.len()
0    6
1    7
2    5

2、lower()

大小写转换,转换成小写字母

s = pd.Series(['Amazon','alibaba','Baidu'])
s.str.lower()
0     amazon
1    alibaba
2      baidu

3、zfill()

右对齐,前面用0填充到指定字符串长度

s = pd.Series(['56783','34','987766721','326'])
s.str.zfill(10) 
0    0000056783
1    0000000034
2    0987766721
3    0000000326

字符串的方法很多,这里就不一一举例了,大家可以参考字符串处理的文章。

 

向量化的正则表达式

Pandas的字符串方法根据Python标准库的re模块实现了正则表达式,下面将介绍Pandas的str属性内置的正则表达式相关方法

Pandas玩转文本处理

1、split()

split,按指定字符或表达式分割字符串,类似split的方法返回一个列表类型的序列

1)基本用法

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.split.html

Series.str.split(pat=None,
                 n=- 1, 
                 expand=False, *, 
                 regex=None )

2)参数解释

pat:str 或编译的正则表达式,可选。要拆分的字符串或正则表达式。如果未指定,则在空格处拆分。

n:int,默认 -1(全部)。限制输出中的拆分数量, None , 0 和 -1 将被解释为返回所有拆分。

expand:布尔值,默认为 False。将拆分的字符串展开为单独的列。

  • 如果 True ,返回 DataFrame/MultiIndex 扩展维度。

  • 如果 False ,则返回包含字符串列表的系列/索引。

regex:布尔值,默认无。确定 passed-in 模式是否为正则表达式:

  • 如果 True ,假设 passed-in 模式是正则表达式

  • 如果 False ,则将模式视为文字字符串。

  • 如果 None 和 pat 长度为 1,则将 pat 视为文字字符串。

  • 如果 None 和 pat 长度不为 1,则将 pat 视为正则表达式。

  • 如果 pat 是已编译的正则表达式,则不能设置为 False

注 意:n 关键字的处理取决于找到的拆分数量:

  • 如果发现拆分 > n ,请先进行 n 拆分

  • 如果发现拆分 n ,则进行所有拆分

  • 如果对于某一行,找到的拆分数 n ,则追加 None 以填充到 n if expand=True

如果使用 expand=True ,Series 和 Index 调用者分别返回 DataFrame 和 MultiIndex 对象。使用带有pat 的regex=False 作为编译的正则表达式会引发错误。

3)案例分析

#按数字分割
s = pd.Series(['QQ1252号码','QQ1353加我','我389的'])
s.str.split('\d+')
0    [QQ, 号码]
1    [QQ, 加我]
2     [我, 的]

# 按固定字符分割
s = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'])
s.str.split('_')

0    [a, b, c]
1    [c, d, e]
2          NaN
3    [f, g, h]


#切分后的列表中的元素可以通过get方法或者 [] 方法进行读取
s.str.split('_').str.get(1)
Out[96]: 
0      b
1      d
2    NaN
3      g

#使用expand方法可以轻易地将这种返回展开为一个数据表
s.str.split('_', expand=True)
     0    1    2
0    a    b    c
1    c    d    e
2  NaN  NaN  NaN
3    f    g    h

#同样,我们也可以限制切分的次数:
s.str.split('_', expand=True, n=1)
     0    1
0    a  b_c
1    c  d_e
2  NaN  NaN
3    f  g_h

2、rsplit()

rsplit与split相似,不同的是,这个切分的方向是反的,即,从字串的尾端向首段切分

1)基础用法

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.rsplit.html

Series.str.rsplit(pat=None, n=- 1, expand=False)

2)参数解释

pat:str 或编译的正则表达式,可选。要拆分的字符串或正则表达式。如果未指定,则在空格处拆分。

n:int,默认 -1(全部)。限制输出中的拆分数量。None , 0 和 -1 将被解释为返回所有拆分。

expand:布尔值,默认为 False。将拆分的字符串展开为单独的列。

  • 如果 True ,返回 DataFrame/MultiIndex 扩展维度。

  • 如果 False ,则返回包含字符串列表的系列/索引。

3)案例分析

s = pd.Series(['QQ1252号码','QQ1353加我','我389的'])
s.str.rsplit('_', expand=True, n=1)
     0    1
0  a_b    c
1  c_d    e
2  NaN  NaN
3  f_g    h

3、replace ()

1)基本用法

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.replace.html

Series.str.replace(pat, repl, n=- 1, case=None, flags=0, regex=None)

2)参数解释

pat:str 或编译的正则表达式,字符串可以是字符序列或正则表达式。

repl:str 或可调用,替换字符串或可调用对象。可调用对象传递正则表达式匹配对象,并且必须返回要使用的替换字符串。

n:int,默认 -1(全部)从一开始就更换的数量。

case:布尔值,默认无。确定替换是否区分大小写:

  • 如果为 True,则区分大小写(如果 pat 是字符串,则默认为)

  • 设置为 False 不区分大小写

  • 如果 pat 是已编译的正则表达式,则无法设置。

flags:int,默认 0(无标志)。正则表达式模块标志,例如重新忽略。如果 pat 是已编译的正则表达式,则无法设置。

regex:布尔值,默认为真。确定 passed-in 模式是否为正则表达式:

  • 如果为 True,则假定 passed-in 模式是正则表达式。

  • 如果为 False,则将模式视为文字字符串

  • 如果 pat 是已编译的正则表达式或 repl 是可调用的,则不能设置为 False。

3)案例分析

replace方法默认使用正则表达式

s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca','', np.nan, 'CABA', 'dog', 'cat'])

s.str.replace('^.a|dog', 'XX-XX ', case=False)
Out[27]: 
0           A
1           B
2           C
3    XX-XX ba
4    XX-XX ca
5            
6         NaN
7    XX-XX BA
8      XX-XX 
9     XX-XX t

pd.Series(['foo', 'fuz', np.nan]).str.replace('f.', 'ba', regex=True)
0    bao
1    baz
2    NaN


pd.Series(['f.o', 'fuz', np.nan]).str.replace('f.', 'ba', regex=False)
0    bao
1    fuz
2    NaN

4、findall()

1)基础用法

Series.str.findall(pat, flags=0)

2)参数解释

pat:正则表达式

flags:Flags from re module, e.g. re.IGNORECASE (default is 0, which means no flags),是否忽略大小写。文章来源地址https://www.toymoban.com/news/detail-407471.html

3)案例分析

import re
#提取聊天记录中的QQ号
s=pd.Series(['QQ号码123452124','QQ123356123','我的Q123356189','Q号123356111注意','加我Q号123356124有惊喜'])
s.str.findall('\d+')
0    [123452124]
1    [123356123]
2    [123356189]
3    [123356111]
4    [123356124]


s.str.findall('Q')
0    [Q, Q]
1    [Q, Q]
2       [Q]
3       [Q]
4       [Q]

s.str.findall('q')
0    []
1    []
2    []
3    []
4    []

s.str.findall('q', flags=re.IGNORECASE)

0    [Q, Q]
1    [Q, Q]
2       [Q]
3       [Q]
4       [Q]

到了这里,关于Pandas玩转文本处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python数据处理】-Pandas笔记

    Pandas是一个强大的Python数据处理库,它提供了高效的数据结构和数据分析工具,使数据处理变得简单而快速。本篇笔记将介绍Pandas中最常用的数据结构——Series和DataFrame,以及数据处理的各种操作和技巧。 (一)创建Series Series是Pandas中的一维数组,类似于带有标签的NumPy数组

    2024年02月12日
    浏览(46)
  • Pandas入门实践2 -数据处理

    为了准备数据进行分析,我们需要执行数据处理。在本节中,我们将学习如何清理和重新格式化数据(例如,重命名列和修复数据类型不匹配)、对其进行重构/整形,以及对其进行丰富(例如,离散化列、计算聚合和组合数据源)。 数据清洗 在本节中,我们将介绍如何创建

    2023年04月22日
    浏览(66)
  • pandas处理双周数据

    处理文件题头格式 导入源 合并两列数据

    2024年02月04日
    浏览(38)
  • Pandas对日期数据的处理

    Pandas对日期数据的处理 Pandas中提供了许多简单易用的日期数据处理函数,包括将字符串转换成为对应的日期数据,根据日期来选取数据等等。接下来,让我们了解一下Pandas中对日期数据的处理。 代码如下: 运行结果: 代码如下: 运行结果: pandas可以使用dt对象获取datetim

    2024年02月06日
    浏览(43)
  • pandas数据清洗——缺失值处理

    使用DataFrame对象的info()方法 原始数据 ​​ 注:NaN为空缺值   查看是否有缺失值    Non-Null Count列显示的是每个索引中不是空缺的个数 使用DataFrame的isnull()方法和notnull()方法 1. isnull()方法——判断是否为空,输出结果为True和False,不为NaN时返回False,为NaN时返回True。     2.

    2024年02月12日
    浏览(55)
  • 头歌Python实训——pandas数据处理

    任务描述 本关任务: 超市销售数据如图所示 建立excel文件“类别销售”,根据不同类别建立多个工作表,将相同类别的销售信息存放在相应的工作表中。 相关知识 为了完成本关任务,你需要掌握:1.读取excel文件,2.筛选dataframe数据,3.将数据写入工作簿和工作表 从excel文件读

    2024年02月04日
    浏览(39)
  • pandas由入门到精通-数据处理

    文中用S代指Series,用Df代指DataFrame 数据清洗是处理大型复杂情况数据必不可少的步骤,这里总结一些数据清洗的常用方法:包括缺失值、重复值、异常值处理,数据类型统计,分箱,随机采样,向量化编码等方法。每种方法都给出了代码和实例,并用表格进行总结。 判断D

    2024年02月11日
    浏览(45)
  • 大数据-玩转数据-oracle的锁查询及处理

    oracle造成锁表的情况: 1.1、查看锁的对象视图: 1.2、锁的级别 0:none 1:null 空 2:Row-S 行共享(RS):共享表锁 3:Row-X 行专用(RX):用于行的修改 4:Share 共享锁(S):阻止其他DML操作 5:S/Row-X 共享行专用(SRX):阻止其他事务操作 6:exclusive 专用(X):独立访问使用 。 1.3 常用的s

    2024年02月07日
    浏览(37)
  • 数据分析-Pandas如何轻松处理时间序列数据

    时间序列数据在数据分析建模中很常见,例如天气预报,空气状态监测,股票交易等金融场景。此处选择巴黎、伦敦欧洲城市空气质量监测 N O 2 NO_2 N O 2 ​ 数据作为样例。 python数据分析-数据表读写到pandas 经典算法-遗传算法的python实现 经典算法-遗传算法的一个简单例子 大

    2024年01月25日
    浏览(45)
  • Python Pandas 处理Excel数据 制图

    目录 1、饼状图  2、条形统计图

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包