文本数据

一、string类型的性质

1. string与object的区别
(1)字符存取方法会返回相应数据的Nullable类型,而object会岁缺失值的存在而改变返回类型
(2) 某些Series方法不能用在string上,例如:Series.str.decode(),存储的是字符串而不是字节
(3)string类型在缺失值存储或运算时,类型会广播为pd.NA,而不是浮点型np.nan
2. string类型的转换
如果将一个其他类型的容器直接转换string类型可能会出错。当下正确的方法是分两部转换,先转为str型object,再转为string类型。str是将该对象转换成字符串类型,string是该对象原本就是字符串

pd.Series([1,'1.']).astype('str').astype('string')
pd.Series([1,2]).astype('str').astype('string')
pd.Series([True,False]).astype('str').astype('string')

上述代码分别是将object型、int型、bool型分两步转换为string类型。直接转会报错。

二、 拆分与拼接

1. str.split方法

(a) 分隔符与str的位置元素选取

s = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'], dtype="string")
s.str.split('_')

结果:

0 [a, b, c]
1 [c, d, e]
2
3 [f, g, h]
dtype: object

对于str方法可以进行元素的选择,如果该单元格元素是列表,那么str[i]表示取出第i个元素,如果是单个元素,则先把元素转为列表在取出

s.str.split('_').str[1]
pd.Series(['a_b_c', ['a','b','c']], dtype="object").str[1]

(b)其他参数

expand参数控制了是否将列拆开,n参数代表最多分割多少次

s.str.split('_',expand=True)

s.str.split('_',n=1)

0 [a, b_c]
1 [c, d_e]
2
3 [f, g_h]
dtype: object

s.str.split('_',expand=True,n=1)

2. str.cat方法

(a)不同对象的拼接模式

cat方法对于不同对象的作用结果并不相同,其中的对象包括:单列、双列、多列

① 对于单个Series而言,就是指所有的元素进行字符合并为一个字符串

s = pd.Series(['ab',None,'d'],dtype='string')
s.str.cat()

‘abc’

其中可选sep分隔符参数,和缺失值替代字符na_rep参数

s.str.cat(sep=',')

结果:

‘ab,d’

s.str.cat(sep=',',na_rep='*')

结果:

‘ab,*,d’

② 对于两个Series合并而言,是对应索引的元素进行合并

s2 = pd.Series(['24',None,None],dtype='string')
s.str.cat(s2)

结果:

0 ab24
1
2
dtype: string

同样也有相应参数,需要注意的是两个缺失值会被同时替换

s.str.cat(s2,sep=',',na_rep='*')

结果:

0 ab,24
1 ,
2 d,*
dtype: string

③ 多列拼接可以分为表的拼接和多Series拼接

表的拼接

s.str.cat(pd.DataFrame({0:['1','3','5'],1:['5','b',None]},dtype='string'),na_rep='*')

结果:

0 ab15
1 3b
2 d5

dtype: string

多个Series拼接

s.str.cat([s+'0',s*2])

结果:

0 abab0abab
1
2 dd0dd
dtype: string

(b)cat中的索引对齐

当前版本中,如果两边合并的索引不相同且未指定join参数,默认为左连接,设置join=‘left’

s2 = pd.Series(list('abc'),index=[1,2,3],dtype='string')
s.str.cat(s2,na_rep='*')

结果:

0 ab*
1 *a
2 db
dtype: string

三、替换

广义上的替换,就是指str.replace函数的应用,fillna是针对缺失值的替换,上一章已经提及

提到替换,就不可避免地接触到正则表达式,可参考我的另一篇博客:

python详解正则表达式

1. str.replace的常见用法

第一个值写r开头的正则表达式,后一个写替换的字符串

s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca','', np.nan, 'CABA', 'dog', 'cat'],dtype="string")
s.str.replace(r'^[AB]','***')

结果:

0 ***
1 ***
2 C
3 ***aba
4 ***aca
5
6
7 CABA
8 dog
9 cat
dtype: string

2. 子组与函数替换

通过正整数调用子组(0返回字符本身,从1开始才是子组)

s.str.replace(r'([ABC])(\w+)',lambda x:x.group(2)[1:]+'*')

结果:

0 A
1 B
2 C
3 ba*
4 ca*
5
6
7 BA*
8 dog
9 cat
dtype: string

利用?P<…>表达式可以对子组命名调用

s.str.replace(r'(?P<one>[ABC])(?P<two>\w+)',lambda x:x.group('two')[1:]+'*')

结果:

0 A
1 B
2 C
3 ba*
4 ca*
5
6
7 BA*
8 dog
9 cat
dtype: string

3. 关于str.replace的注意事项

首先,要明确str.replace和replace并不是一个东西:

str.replace针对的是object类型或string类型,默认是以正则表达式为操作,目前暂时不支持DataFrame上使用

replace针对的是任意类型的序列或数据框,如果要以正则表达式替换,需要设置regex=True,该方法通过字典可支持多列替换

但现在由于string类型的初步引入,用法上出现了一些问题,这些issue有望在以后的版本中修复

(a)str.replace赋值参数不得为pd.NA

这听上去非常不合理,例如对满足某些正则条件的字符串替换为缺失值,直接更改为缺失值在当下版本就会报错

#pd.Series([‘A’,‘B’],dtype=‘string’).str.replace(r’[A]’,pd.NA) #报错
#pd.Series([‘A’,‘B’],dtype=‘O’).str.replace(r’[A]’,pd.NA) #报错

此时,可以先转为object类型再转换回来,曲线救国:

pd.Series(['A','B'],dtype='string').astype('O').replace(r'[A]',pd.NA,regex=True).astype('string')

结果:

0
1 B
dtype: string

pd.Series(['A','B'],dtype='string').replace(r'[A]','C',regex=True)

结果:

0 A
1 B
dtype: string

pd.Series(['A','B'],dtype='O').replace(r'[A]','C',regex=True)

结果:

0 C
1 B
dtype: object

(c)string类型序列如果存在缺失值,不能使用replace替换

pd.Series(['A',np.nan],dtype='string').str.replace('A','B')

结果:

0 B
1
dtype: string

综上,概况的说,除非需要赋值元素为缺失值(转为object再转回来),否则请使用str.replace方法

四、子串匹配与提取

1. str.extract方法

(a)常见用法

pd.Series(['10-87', '10-88', '10-89'],dtype="string").str.extract(r'([\d]{2})-([\d]{2})')

结果:
| | 0 | 1 |
|0–|-10-|87 |
|1 |10 |88 |
|2 |10 |89 |

使用子组名作为列名

pd.Series(['10-87', '10-88', '-89'],dtype="string").str.extract(r'(?P<name_1>[\d]{2})-(?P<name_2>[\d]{2})'

利用?正则标记选择部分提取

],dtype="string").str.extract(r'(?P<name_1>[\d]{2})?-(?P<name_2>[\d]{2})')
pd.Series(['10-87', '10-88', '10-'],dtype="string").str.extract(r'(?P<name_1>[\d]{2})-(?P<name_2>[\d]{2})?')

(b)expand参数(默认为True)

对于一个子组的Series,如果expand设置为False,则返回Series,若大于一个子组,则expand参数无效,全部返回DataFrame

对于一个子组的Index,如果expand设置为False,则返回提取后的Index,若大于一个子组且expand为False,报错

s = pd.Series(["a1", "b2", "c3"], ["A11", "B22", "C33"], dtype="string")
s.index

结果:

Index([‘A11’, ‘B22’, ‘C33’], dtype=‘object’)

s.str.extract(r'([\w])')

| |0 |
|A11|a|
|B22 | b |
|C33 | c |

s.str.extract(r'([\w])',expand=False)

结果:

A11 a
B22 b
C33 c
dtype: string

2. str.extractall方法

与extract只匹配第一个符合条件的表达式不同,extractall会找出所有符合条件的字符串,并建立多级索引(即使只找到一个)

s = pd.Series(["a1a2", "b1", "c1"], index=["A", "B", "C"],dtype="string")
two_groups = '(?P<letter>[a-z])(?P<digit>[0-9])'
s.str.extract(two_groups, expand=True)
s.str.extractall(two_groups)

3. str.contains和str.match

前者的作用为检测是否包含某种正则模式

pd.Series(['1', None, '3a', '3b', '03c'], dtype="string").str.contains(r'[0-9][a-z]')

结果:

0 False
1
2 True
3 True
4 True
dtype: boolean

五、常用字符串方法

1. 过滤型方法

(a)str.strip

常用于过滤空格

pd.Series(list('abc'),index=[' space1  ','space2  ','  space3'],dtype="string").index.str.strip()

结果:

Index([‘space1’, ‘space2’, ‘space3’], dtype=‘object’)

(b)str.lower和str.upper

表示字母大小写

(c)str.swapcase和str.capitalize

分别表示交换字母大小写和大写首字母

2. isnumeric方法

检查每一位是否都是数字

pd.Series(['1.2','1','-0.3','a',np.nan],dtype="string").str.isnumeric()

结果:

0 False
1 True
2 False
3 False
4
dtype: boolean

pandas详解文本数据相关推荐

  1. Python全栈开发-数据分析-02 Pandas详解 (上)

    Pandas详解 (上) 一. 安装pandas 1.按Win+R,输入CMD确定, 输入 pip install pandas 回车 还要安装xlrd,否则你打不开Excel文件 pip insta ...

  2. AI艺术的背后:详解文本生成图像模型【基于 Diffusion Model】

    系列文章链接: AI艺术的背后:详解文本生成图像模型[基于 VQ-VAE] AI艺术的背后:详解文本生成图像模型[基于GAN] AI艺术的背后:详解文本生成图像模型[基于Diffusion Model ...

  3. AI艺术的背后:详解文本生成图像模型【基于GAN】

    系列文章链接: AI艺术的背后:详解文本生成图像模型[基于 VQ-VAE] AI艺术的背后:详解文本生成图像模型[基于GAN] AI艺术的背后:详解文本生成图像模型[基于Diffusion Model ...

  4. AI艺术的背后:详解文本生成图像模型【基于 VQ-VAE】

    系列文章链接: AI艺术的背后:详解文本生成图像模型[基于 VQ-VAE] AI艺术的背后:详解文本生成图像模型[基于GAN] AI艺术的背后:详解文本生成图像模型[基于Diffusion Model ...

  5. Python全栈开发-数据分析-03 Pandas详解 (中)

    Pandas详解 (中) 一. 处理缺失值 1.1 drop函数:删除行,删除列 1.删除某列或某行数据可以用到pandas提供的方法drop 2.drop方法的用法: drop(labels, ax ...

  6. Python全栈开发-数据分析-03 Pandas详解 (下)

    Pandas详解 (下) 一. Excel文件的拆分与合并 1.1 一个文件夹下多个工作簿的合并[单独Sheet] 思路: 1,把文件夹下面所有的文件都遍历出来 2.循环读取每个文件 (1)第一次读取 ...

  7. R语言tidyr包gather()函数实战详解:数据收缩、从宽表到窄表

    R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 目录 R语言tidyr包gather()函数实战详解:数据收缩.从宽表到窄表 收缩两列数据

  8. R语言tidyr包spread()函数实战详解:数据裂变、从窄表到宽表

    R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表 目录 R语言tidyr包spread()函数实战详解:数据裂变.从窄表到宽表

  9. linux 进程间通信 dbus-glib【实例】详解三 数据类型和dteeth(类型签名type域)(层级结构:服务Service --> Node(对象、object) 等 )(附代码)

    linux 进程间通信 dbus-glib[实例]详解一(附代码)(d-feet工具使用) linux 进程间通信 dbus-glib[实例]详解二(上) 消息和消息总线(附代码) linux 进程间 ...

最新文章

  1. HP服务器选型一般标准
  2. java gui 选项_【Java-GUI】04 菜单
  3. LeetCode455 分发饼干(二分法)
  4. 1874 素数和最大 - Wikioi
  5. oracle存储过程与函数的区别及作用,Oracle存储过程与存储函数-入门
  6. 爬虫——————爬取中金所,深交所,上交所期权数据
  7. java 遍历二进制_读取二进制文件并循环遍历每个字节
  8. OpenCV-Python实战(20)——OpenCV计算机视觉项目在Web端的部署
  9. struts2通配符及Action开发的三种方式
  10. 认识ruquest对象
  11. 【目标检测大集合】R-FCN、SSD、YOLO2、faster-rcnn和labelImg实验笔记
  12. 新手C语言学习第一课——小学生水平级
  13. 企业微信api发送告警信息
  14. 重聚焦显微镜原理和理解
  15. 【bat】bat批处理使用WinRAR.exe 压缩文件,解压文件
  16. sja1000 中断_[转载]SJA1000的错误中断处理
  17. 【Houdini官方入门教程翻译】概述——UV和纹理贴图
  18. JavaScript--面向对象--猜拳游戏
  19. Cisco 自反ACL真机配置实例
  20. VPF 系列低温恒温器 — 样品在真空中

热门文章

  1. 【操作系统】文件管理
  2. 计算机组成原理总,计算机组成原理总总结复习(88页)-原创力文档
  3. 大图片显示在客户端,被压扁失真的问题
  4. 服务器 战地4 无限载入,战地4卡在loading界面无限载入的解决方法_快吧单机游戏...
  5. 跨癌症模型模拟免疫细胞行为
  6. The Lottery Ticket Hypothesis
  7. 如何将Excel表格中的数据粘贴到记事本中,且每列间距都为一个空格?
  8. Mybatis-Plus根据时间段去查询数据
  9. k8s中Pod域名解析失败
  10. 下载苹果官网视频的方式