大家好,我是东哥。
继续更新 pandas
数据清洗,历史文章:
感兴趣可以关注这个话题pandas数据清洗,第一时间看到更新。
所有数据和代码可在我的 GitHub
获取:
https://github.com/xiaoyusmd/PythonDataScience
本次来介绍关于文本处理的常用方法。
文本的主要两个类型是 string
和 object
。如果不特殊指定类型为 string
,文本类型一般为 object
。
文本的操作主要是通过 访问器 str
来实现的,功能十分强大,但使用前需要注意以下几点。
- 访问器只能对
Series
数据结构使用。 除了常规列变量df.col
以外,也可以对索引类型df.Index
和df.columns
使用 - 确保访问的对象类型是字符串
str
类型。 如果不是需要先astype(str)
转换类型,否则会报错 - 访问器可以多个连接使用。 如
df.col.str.lower().str.upper()
,这个和Dataframe
中的一行操作是一个原理
下面正式介绍文本的各种骚操作,基本可以涵盖日常95%的数据清洗需要了,一共 8 个场景。
以下操作均基于下面的数据:
import pandas as pd
import numpy as np
df = pd.DataFrame({'name':['jordon', 'MIKE', 'Kelvin', 'xiaoLi', 'qiqi','Amei'],
'Age':[18, 30, 45, 23, 45, 62],
'level':['high','Low','M','L','middle',np.nan],
'Email':['jordon@sohu.com','Mike@126.cn','KelvinChai@gmail.com','xiaoli@163.com',np.nan,'amei@qq.com']})
Index(['name', 'age', 'level', 'email'], dtype='object')
格式判断
下面均为判断操作,因此返回布尔值。
s.str.isalpha
s.str.isnumeric
s.str.isalnum
s.str.isupper
s.str.islower
s.str.isdigit
对齐
s.str.center(, fillchar='*')
s.str.ljust(8, fillchar='*')
s.str.rjust(8, fillchar='*')
s.str.pad(width=8, side='both',fillchar='*')
df.name.str.center(8, fillchar='*')
0 [jordon, sohu.com]
1 [Mike, 126.cn]
2 [KelvinChai, gmail.com]
3 [xiaoli, 163.com]
4 NaN
5 [amei, qq.com]
df.Email.str.split('@' ,expand=True)
0 1 2
0 jordon sohu com
1 Mike 126 cn
2 KelvinChai gmail com
3 xiaoli 163 com
4 NaN NaN NaN
5 amei qq com
3、文本替换
文本替换有几种方法: replace
, slice_replace
, repeat
replace替换
replace
方法是最常用的替换方法,参数如下:
pal
:为被替代的内容字符串,也可以为正则表达式repl
:为新内容字符串,也可以是一个被调用的函数regex
:用于设置是否支持正则,默认是True
df.Email.str.replace('com','cn')
0 xxx@sohu.com
1 xxx@126.cn
2 xxx@gmail.com
3 xxx@163.com
4 NaN
5 xxx@qq.com
或者将新内容写成 被调用的函数。
df.Email.str.replace('(.*?)@', lambda x:x.group().upper())
0 jXXrdon@sohu.com
1 MXXke@126.cn
2 KXXlvinChai@gmail.com
3 xXXaoli@163.com
4 NaN
5 aXXei@qq.com
重复替换
repeat
可以实现重复替换的功能,参数 repeats
设置重复的次数。
df.name.str.repeat(repeats=2)
'jordonMIKEKelvinxiaoLiqiqiAmei'
df.name.str.cat(sep='-')
'high-Low-M-L-middle-*'
2. 拼接序列和其他类列表型对象为新的序列
下面先将name列和 *
列拼接,再将 level
列拼接,形成一个新的序列。
df.name.str.cat(['*']*6).str.cat(df.level)
0 jordonhighjordon@sohu.com
1 MIKELowMike@126.cn
2 KelvinMKelvinChai@gmail.com
3 xiaoLiLxiaoli@163.com
4 qiqimiddle*
5 Amei*amei@qq.com
将一个序列与多个对象拼接为一个新的序列
5、文本提取
文本提取主要通过 extract
来实现的。
extract
参数:
pat
: 通过正则表达式实现一个提取的patternflags
: 正则库re
中的标识,比如re.IGNORECASE
expand
: 当正则只提取一个内容时,如果expand=True
会展开返回一个DataFrame
,否则返回一个Series
df.Email.str.extract(pat='(.*?)@(.*).com')
Email @position
0 jordon@sohu.com 6.0
1 Mike@126.cn 4.0
2 KelvinChai@gmail.com 10.0
3 xiaoli@163.com 6.0
4 NaN NaN
5 amei@qq.com 4.0
上面示例返回 @
在email变量中的位置。
另外一个查找方法是 findall
findall
参数:
pat
: 要查找的内容,支持正则表达式flag
: 正则库re
中的标识,比如re.IGNORECASE
findall
和 find
的区别是支持正则表达式,并返回具体内容。这个方法有点类似 extract
,也可以用于提取,但不如 extract
方便。
df.Email.str.findall('(.*?)@(.*).com')
0 True
1 False
2 True
3 True
4 *
5 True
df.loc[df.Email.str.contains('jordon|com', na=False)]
Amei Kelvin MIKE jordon qiqi xiaoLi
0 0 0 0 1 0 0
1 0 0 1 0 0 0
2 0 1 0 0 0 0
3 0 0 0 0 0 1
4 0 0 0 0 1 0
5 1 0 0 0 0 0
以上就是本次分享内容。
原创不易,欢迎点赞、留言、分享,支持我继续写下去。
感兴趣可以关注这个话题pandas数据清洗,第一时间看到更新。
所有数据和代码可在我的 GitHub
获取:
https://github.com/xiaoyusmd/PythonDataScience
Original: https://blog.csdn.net/yuxiaosmd/article/details/123172469
Author: Python数据科学
Title: pandas 文本处理大全(附代码)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/738207/
转载文章受原作者版权保护。转载请注明原作者出处!