数据分析 如何用Pandas处理文本数据Word文件下载.docx
- 文档编号:20413227
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:18
- 大小:423.57KB
数据分析 如何用Pandas处理文本数据Word文件下载.docx
《数据分析 如何用Pandas处理文本数据Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据分析 如何用Pandas处理文本数据Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
1.'
]).astype('
string'
)#报错
#pd.Series([1,2]).astype('
#pd.Series([True,False]).astype('
当下正确的方法是分两部转换,先转为str型object,在转为string类型:
pd.Series([1,'
str'
).astype('
)
01
11
dtype:
string
pd.Series([1,2]).astype('
12
pd.Series([True,False]).astype('
0True
1False
二、拆分与拼接
2.1str.split方法
(a)分割符与str的位置元素选取
s=pd.Series(['
a_b_c'
'
c_d_e'
np.nan,'
f_g_h'
],dtype="
string"
s
0a_b_c
1c_d_e
2
3f_g_h
根据某一个元素分割,默认为空格
s.str.split('
_'
0[a,b,c]
1[c,d,e]
3[f,g,h]
object
这里需要注意split后的类型是object,因为现在Series中的元素已经不是string,而包含了list,且string类型只能含有字符串。
对于str方法可以进行元素的选择,如果该单元格元素是列表,那么str[i]表示取出第i个元素,如果是单个元素,则先把元素转为列表在取出。
).str[1]
0b
1d
3g
pd.Series(['
['
a'
'
b'
c'
]],
dtype="
object"
).str[1]
#第一个元素先转为['
]
0_
1b
(b)其他参数
expand参数控制了是否将列拆开,n参数代表最多分割多少次
expand=True)
n=1)
0[a,b_c]
1[c,d_e]
3[f,g_h]
expand=True,n=1)
2.2
(a)不同对象的拼接模式
cat方法对于不同对象的作用结果并不相同,其中的对象包括:
单列、双列、多列
①对于单个Series而言,就是指所有的元素进行字符合并为一个字符串
ab'
None,'
d'
],dtype='
0ab
1
2d
s.str.cat()
'
abd'
其中可选sep分隔符参数,和缺失值替代字符na_rep参数
s.str.cat(sep='
ab,d'
na_rep='
*'
ab,*,d'
②对于两个Series合并而言,是对应索引的元素进行合并
s2=pd.Series(['
24'
None,None],dtype='
s2
024
s.str.cat(s2)
0ab24
同样也有相应参数,需要注意的是两个缺失值会被同时替换
s.str.cat(s2,sep='
0ab,24
1*,*
2d,*
③多列拼接可以分为表的拼接和多Series拼接
∙表的拼接
s.str.cat(pd.DataFrame({0:
1'
3'
5'
],1:
None]},dtype='
),na_rep='
0ab15
1*3b
2d5*
∙多个Series拼接
s.str.cat([s+'
0'
s*2])
0abab0abab
2dd0dd
(b)cat中的索引对齐
当前版本中,如果两边合并的索引不相同且未指定join参数,默认为左连接,设置join='
left'
s2=pd.Series(list('
abc'
),index=[1,2,3],dtype='
1a
2b
3c
s.str.cat(s2,na_rep='
0ab*
1*a
2db
三、替换
广义上的替换,就是指str.replace函数的应用,fillna是针对缺失值的替换,上一章已经提及。
提到替换,就不可避免地接触到正则表达式,这里默认读者已掌握常见正则表达式知识点,若对其还不了解的,可以通过这份资料来熟悉
3.1
str.replace的常见用法
A'
B'
C'
Aaba'
Baca'
CABA'
dog'
cat'
],dtype="
0A
1B
2C
3Aaba
4Baca
5
6
7CABA
8dog
9cat
第一个值写r开头的正则表达式,后一个写替换的字符串
s.str.replace(r'
^[AB]'
***'
0***
1***
3***aba
4***aca
3.2子组与函数替换
通过正整数调用子组(0返回字符本身,从1开始才是子组)
([ABC])(\w+)'
lambdax:
x.group
(2)[1:
]+'
3ba*
4ca*
7BA*
利用?
P<
....>
表达式可以对子组命名调用
(?
P[ABC])(?
P\w+)'
x.group('
two'
)[1:
3.3关于str.replace的注意事项
首先,要明确str.replace和replace并不是一个东西:
∙str.replace针对的是object类型或string类型,默认是以正则表达式为操作,目前暂时不支持DataFrame上使用;
∙replace针对的是任意类型的序列或数据框,如果要以正则表达式替换,需要设置regex=True,该方法通过字典可支持多列替换。
但现在由于string类型的初步引入,用法上出现了一些问题,这些issue有望在以后的版本中修复。
(a)str.replace赋值参数不得为pd.NA
这听上去非常不合理,例如对满足某些正则条件的字符串替换为缺失值,直接更改为缺失值在当下版本就会报错
#pd.Series(['
).str.replace(r'
[A]'
pd.NA)#报错
O'
此时,可以先转为object类型再转换回来,曲线救国:
).replace(r'
pd.NA,regex=True).astype('
0
至于为什么不用replace函数的regex替换(但string类型replace的非正则替换是可以的),原因在下面一条
(b)对于string类型Series
在使用replace函数时不能使用正则表达式替换,该bug现在还未修复
regex=True)
0C
(c)string类型序列如果存在缺失值,不能使用replace替换
np.nan],dtype='
).replace('
).str.replace('
0B
综上,概况的说,除非需要赋值元素为缺失值(转为object再转回来),否则请使用str.replace方法
四、子串匹配与提取
4.1str.extract方法
(a)常见用法
10-87'
10-88'
10-89'
).str.extract(r'
([\d]{2})-([\d]{2})'
使用子组名作为列名
-89'
P[\d]{2})-(?
P[\d]{2})'
正则标记选择部分提取
P[\d]{2})?
-(?
10-'
(b)expand参数(默认为True)
对于一个子组的Series,如果expand设置为False,则返回Series,若大于一个子组,则expand参数无效,全部返回DataFrame。
对于一个子组的Index,如果expand设置为False,则返回提取后的Index,若大于一个子组且expand为False,报错。
s=pd.Series(["
a1"
"
b2"
c3"
],["
A11"
B22"
C33"
s.index
Index(['
A11'
B22'
C33'
],dtype='
object'
s.str.extract(r'
([\w])'
expand=False)
A11a
B22b
C33c
s.index.str.extract(r'
([\w])([\d])'
#s.index.str.extract(r'
expand=False)#报错
4.2str.extractall方法
与extract只匹配第一个符合条件的表达式不同,extractall会找出所有符合条件的字符串,并建立多级索引(即使只找到一个)
a1a2"
b1"
c1"
],index=["
A"
B"
C"
two_groups='
P[a-z])(?
P[0-9])'
s.str.extract(two_groups,expand=True)
s.str.extractall(two_groups)
s['
]='
a1'
如果想查看第i层匹配,可使用xs方法
b1b2"
c1c2"
s.str.extractall(two_groups).xs(1,level='
match'
4.3str.contains和str.match
前者的作用为检测是否包含某种正则模式
None,'
3a'
3b'
03c'
).str.contains(r'
[0-9][a-z]'
0False
2True
3True
4True
boolean
可选参数为na
).str.contains('
na=False)
3False
4False
str.match与其区别在于,match依赖于python的re.match,检测内容为是否从头开始包含该正则模式
3a_'
).str.match(r'
na=False)
_3a'
2False
五、常用字符串方法
5.1过滤型方法
(a)str.strip
常用于过滤空格
pd.Series(list('
),index=['
space1'
space2'
space3'
).index.str.strip()
space1'
space2'
space3'
(b)str.lower和str.upper
pd.Series('
dtype="
).str.lower()
0a
).str.upper()
(c)str.swapcase和str.capitalize
分别表示交换字母大小写和大写首字母
abCD'
).str.swapcase()
0ABcd
).str.capitalize()
0Abcd
5.2isnumeric方法
检查每一位是否都是数字,请问如何判断是否是数值?
(问题二)
1.2'
-0.3'
np.nan],dtype="
).str.isnumeric()
1True
4
六、问题与练习
6.1问题
【问题一】
str对象方法和df/Series对象方法有什么区别?
【问题二】
给出一列string类型,如何判断单元格是否是数值型数据?
【问题三】
rsplit方法的作用是什么?
它在什么场合下适用?
【问题四】
在本章的第二到第四节分别介绍了字符串类型的5类操作,请思考它们各自应用于什么场景?
6.2
练习
【练习一】
现有一份关于字符串的数据集,请解决以下问题:
(a)现对字符串编码存储人员信息(在编号后添加ID列),使用如下格式:
“×
×
(名字):
国人,性别×
,生于×
年×
月×
日”
#方法一
>
ex1_ori=pd.read_csv('
data/String_data_one.csv'
index_col='
人员编号'
ex1_ori.head()
姓名国籍性别出生年出生月出生日
人员编号
1aesfd2男1942810
2fasefa5女1985104
3aeagd4女19461015
4aef4男1999513
5eaf1女2010624
ex1=ex1_ori.copy()
ex1['
冒号'
]='
:
逗号'
,'
国人'
性别2'
性别'
生于'
年'
月'
日'
ID=ex1['
姓名'
].str.cat([ex1['
],
国籍'
].astype('
),
],
出生年'
),
出生月'
出生日'
])
ex1_ori['
ID'
]=ID
ex1_ori
姓名国籍性别出生年出生月出生日ID
1aesfd2男1942810aesfd:
2国人,性别男,生于1942年8月10日
2fasefa5女1985104fasefa:
5国人,性别女,生于1985年10月4日
3aeagd4女19461015aeagd:
4国人,性别女,生于1946年10月15日
4aef4男1999513aef:
4国人,性别男,生于1999年5月13日
5
eaf
1
女
2010
6
24
eaf:
1国人,性别女,生于2010年6月24日
(b)将(a)中的人员生日信息部分修改为用中文表示(如一九七四年十月二十三日),其余返回格式不变。
(c)将(b)中的ID列结果拆分为原列表相应的5列,并使用equals检验是否一致。
#参考答案
dic_year={i[0]:
i[1]foriinzip(list('
零一二三四五六七八九'
),list('
0123456789'
))}
dic_two={i[0]:
十一二三四五六七八九'
dic_one={'
十'
:
二十'
2'
三十'
None:
}
df_res=df_new['
].str.extract(r'
姓名>
[a-zA-Z]+):
国籍>
[\d])国人,性别(?
性别>
[\w]),生于(?
出生年>
[\w]{4})年(?
出生月>
[\w]+)月(?
出生日>
[\w]+)日'
df_res['
]=df_res['
].str.replace(r'
(\w)+'
.join([dic_year[x.group(0)[i]]fori
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据分析 如何用Pandas处理文本数据 数据 分析 何用 Pandas 处理 文本
![提示](https://static.bdocx.com/images/bang_tan.gif)