【编程实践】Joyful-Pandas(下)Task02(第七章):文本数据
【编程实践】Joyful-Pandas(下)Task02(第七章):文本数据
缺失数据和文本数据(尤其是混杂性文本)是数据预处理中比较麻烦的类型,本章节聚焦于文本数据。
理论部分
- 掌握基本正则表达式的用法
- 理解string类型的性质
- 掌握文本类型的5类操作
- 熟悉常见字符串方法
练习部分
- 两道文本数据练习题
import pandas as pd import numpy as np
string类型的性质
string与object的区别
string类型和object不同之处有三:
- 字符存取方法(string accessor methods,如str.count)会返回相应数据的Nullable类型,而object会随缺失值的存在而改变返回类型
- 某些Series方法不能在string上使用,例如: Series.str.decode(),因为存储的是字符串而不是字节
- string类型在缺失值存储或运算时,类型会广播为pd.NA,而不是浮点型np.nan
其余全部内容在当前版本下完全一致,但迎合Pandas的发展模式,我们仍然全部用string来操作字符串
String类型的转换
如果将一个其他类型的容器直接转换string类型可能会出错:
#pd.Series([1,'1.']).astype('string') #报错 #pd.Series([1,2]).astype('string') #报错 #pd.Series([True,False]).astype('string') #报错
当下正确的方法是分两部转换,先转为str型object,在转为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')
拆分与拼接
str.split方法
分割符与str的位置元素选取
s = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'], dtype="string") s
根据某一个元素分割,默认为空格
s.str.split('_')
这里需要注意split后的类型是object,因为现在Series中的元素已经不是string,而包含了list,且string类型只能含有字符串
对于str方法可以进行元素的选择,如果该单元格元素是列表,那么str[i]表示取出第i个元素,如果是单个元素,则先把元素转为列表在取出
s.str.split('_').str[1]
pd.Series(['a_b_c', ['a','b','c']], dtype="object").str[1] #第一个元素先转为['a','_','b','_','c']
其他参数
expand参数控制了是否将列拆开,n参数代表最多分割多少次
s.str.split('_',expand=True)
s.str.split('_',n=1)
s.str.split('_',expand=True,n=1)
str.cat方法
不同对象的拼接模式
cat方法对于不同对象的作用结果并不相同,其中的对象包括:单列、双列、多列
① 对于单个Series而言,就是指所有的元素进行字符合并为一个字符串
s = pd.Series(['ab',None,'d'],dtype='string') s
s.str.cat()
其中可选sep分隔符参数,和缺失值替代字符na_rep参数
s.str.cat(sep=',')
s.str.cat(sep=',',na_rep='*')
② 对于两个Series合并而言,是对应索引的元素进行合并
s2 = pd.Series(['24',None,None],dtype='string') s2
s.str.cat(s2)
同样也有相应参数,需要注意的是两个缺失值会被同时替换
s.str.cat(s2,sep=',',na_rep='*')
③ 多列拼接可以分为表的拼接和多Series拼接
表的拼接
s.str.cat(pd.DataFrame({0:['1','3','5'],1:['5','b',None]},dtype='string'),na_rep='*')
s.str.cat([s+'0',s*2])
cat中的索引对齐
当前版本中,如果两边合并的索引不相同且未指定join参数,默认为左连接,设置join=‘left’
s2 = pd.Series(list('abc'),index=[1,2,3],dtype='string') s2
s.str.cat(s2,na_rep='*')
替换
广义上的替换,就是指str.replace函数的应用,fillna是针对缺失值的替换,上一章已经提及
提到替换,就不可避免地接触到正则表达式,这里默认读者已掌握常见正则表达式知识点,若对其还不了解的,可以通过这份资料来熟悉
子串匹配与提取
- str.extract方法
- str.extractall方法
- str.contains和str.match
常用字符串方法
- 过滤型方法
(a)str.strip
(b)str.lower和str.upper
(c)str.swapcase和str.capitalize - isnumeric方法
问题与练习
问题
问题一
str对象方法和df/Series对象方法有什么区别?
问题二
给出一列string类型,如何判断单元格是否是数值型数据?
问题三
rsplit方法的作用是什么?它在什么场合下适用?
问题四
在本章的第二到第四节分别介绍了字符串类型的5类操作,请思考它们各自应用于什么场景?
练习
练习一
现有一份关于字符串的数据集,请解决以下问题:
(a)现对字符串编码存储人员信息(在编号后添加ID列),使用如下格式:“×××(名字):×国人,性别×,生于×年×月×日”
(b)将(a)中的人员生日信息部分修改为用中文表示(如一九七四年十月二十三日),其余返回格式不变。
(c)将(b)中的ID列结果拆分为原列表相应的5列,并使用equals检验是否一致。
pd.read_csv('data/String_data_one.csv',index_col='人员编号').head()
人员编号 | 姓名 | 国籍 | 性别 | 出生年 | 出生月 | 出生日 |
---|---|---|---|---|---|---|
1 | aesfd | 2 | 男 | 1942 | 8 | 10 |
2 | fasefa | 5 | 女 | 1985 | 10 | 4 |
3 | aeagd | 4 | 女 | 1946 | 10 | 15 |
4 | aef | 4 | 男 | 1999 | 5 | 13 |
5 | eaf | 1 | 女 | 2010 | 6 | 24 |
练习二】
现有一份半虚拟的数据集,第一列包含了新型冠状病毒的一些新闻标题,请解决以下问题:
(a)选出所有关于北京市和上海市新闻标题的所在行。
(b)求col2的均值。
(c)求col3的均值。
pd.read_csv('data/String_data_two.csv').head()
— | col1 | col2 | col3 |
---|---|---|---|
0 | 鄂尔多斯市第2例确诊患者治愈出院 | 19 | 363.6923 |
1 | 云南新增2例,累计124例 | -67 | -152.281 |
2 | 武汉协和医院14名感染医护出院 | -86 | 325.6221 |
3 | 山东新增9例,累计307例 | -74 | -204.9313 |
4 | 上海开学日期延至3月 | -95 | 4.05 |
- 网络编程复习(十):实践----数据通信
- Pandas 文本数据方法 find( ) rfind( ) index( ) rindex( )
- Pandas 文本数据方法 startswith( ) endwith( )
- Pandas 文本数据方法 repeat( )
- Python编程:从入门到实践——练习题答案(第七章)
- Python编程快速上手——让繁琐工作自动化 第七章 实践项目
- 浅谈pandas,pyspark 的大数据ETL实践经验
- Python编程从入门到实践(第七章用户输入和while循环学习总结)
- 【数据平台】pandas将一列中的文本拆分成多行
- Pandas 文本数据方法 slice( )
- pandas(六)读写文本格式的数据
- Pandas 文本数据方法 split()rsplit()
- Pandas 文本数据方法 capitalize( ) lower( ) upper( )
- Pandas数据分析库常用生僻高频语法 -- Python编程
- Pandas 读取文本格式数据
- python 编程从入门到实践 第二章 变量和简单数据类型
- Python编程从入门到实践 -----第2章:变量和简单数据类型(课后习题答案)
- Pandas 文本数据方法 pad( ) center( ) ljust() rjust() zfill()
- Pandas 文本数据方法 count( )
- Pandas-文本数据