您现在的位置是:网站首页> 编程资料编程资料

Pandas数据分析之pandas文本处理_python_

2023-05-26 417人已围观

简介 Pandas数据分析之pandas文本处理_python_

前言

pandas对文本数据也有很多便捷处理方法,可以不用写循环,向量化操作运算速度快,还可以进行高级的正则表达式,各种复杂的逻辑筛选和匹配提取信息。对于机器学习来说,从文本中做特征工程很是很有用的。

还是先导入包,读取案例数据:

import numpy as np import pandas as pd data = 'https://www.gairuo.com/file/data/dataset/team.xlsx' df = pd.read_excel(data) 

文本数据类型

#object 和 StringDtype 是 Pandas 的两个文本类型,不过作为新的数据类型,官方推荐 StringDtype 的使用。
#默认情况下,文本数据会被推断为 object 类型。

pd.Series(['a', 'b', 'c'])

string 类型需要专门进行指定:

pd.Series(['a', 'b', 'c'], dtype="string") pd.Series(['a', 'b', 'c'], dtype=pd.StringDtype())

​转换,可以从其他类型转换到这两个类型:

s = pd.Series(['a', 'b', 'c']) s.astype("object") # 转换为 object s.astype("string") # 转换为 string # 类型转换,支持 string 类型 df.convert_dtypes().dtypes

推荐使用StringDtype类型取处理文本

字符操作

我们可以使用 .str. 访问器(Accessors)来对内容进行字符操作:

生成案例数据:

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

s.str.lower()# 转为小写

对于非字符类型我们可以先进行转换,再使用

# 转为 object df.Q1.astype(str).str # 转为 StringDtype df.team.astype("string").str df.Q1.astype(str).astype("string").str

​.str后要展示数据要进行分割

#.str后要展示数据要进行分割 df.team.astype("string").str.strip()#等价于df.team.astype("string")

 对索引进行操作:

df.index.str.lower() # 对表头,列名进行操作 df.columns.str.lower() df.columns.str.strip() #相当于df.columns #如果对数据连续进行字符操作,则每个操作都要使用 .str 方法: df.columns.str.strip().str.lower().str.replace('q', '_')

文本格式

格式转化:

#格式转换 s = pd.Series(['lower', 'CAPITALS', 'this is a sentence', 'SwApCaSe']) s.str.lower() # 转为小写 s.str.upper() # 转为大写 s.str.title() # 标题格式,每个单词大写 s.str.capitalize() # 首字母大写 s.str.swapcase() # 大小写互换 s.str.casefold() # 转为小写,支持其他语言如德语

文本对齐

类似字符串的格式化,可以填充或者对齐

# 居中对齐,宽度为10,用 - 填充 s.str.center(10, fillchar='-') # 左对齐 s.str.ljust(10, fillchar='-') # 右对齐 s.str.rjust(10, fillchar='-')

​指定宽度,填充内容对齐方式,填充内容

# side{‘left', ‘right', ‘both'}, default ‘left' s.str.pad(width=10, side='left', fillchar='-') # 填充对齐 s.str.zfill(10) # 生成字符,不足10位的前边加0

​文本计数和编码

# 指定字母的数量 s.str.count('a') # 支持正则,包含 abc 三个字母的总数 s.str.count(r'a|b|c') # 字符长度 s.str.len()

# 编码 s.str.encode('utf-8') # 解码 s.str.decode('utf-8') # 字符串的Unicode普通格式 # form{‘NFC', ‘NFKC', ‘NFD', ‘NFKD'} s.str.normalize('NFC')

格式判断

#类别判断,以下方法可以判断文本的相关格式:

# 检查字母和数字字符 s.str.isalpha() # 是否纯英文数字单词组成 s.str.isalnum() # 是否单词、数字或者它们组合形式组成

 请注意,对于字母数字检查,针对混合了任何额外标点或空格的字符的检查将计算为 False

s.str.isdecimal() # 是否数字 0-9 组成合规10进制数字 s.str.isdigit() # 同 但可识别 unicode中的上标和下标数字 s.str.isnumeric() # 是否可识别为一个数字,同 isdigit 可识别分数 s.str.isdecimal() #是否为小数 s.str.isspace() # 是否空格 s.str.islower() # 是否小写 s.str.isupper() # 是否大写 s.str.istitle() # 是否标题格式,只有第一个字母大写

 wrap将长文本拆分开指定宽度的字符,用换行连接 

s.str.wrap(10) 

文本高级处理

文本分割

#对内容中的下划线进行了分隔,分隔后每个内容都成为了一个列表,其中对空值是不起作用的。 s2 = pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'], dtype="string") s2.str.split('_')

分隔后可以使用 get 或者 [] 来取出相应内容,不过 [] 是列表切片操作更加灵活,不仅可以取出单个内容,也可以取出多个内容组成的片断。
取出每行第二个,列表索引从 0 开始

s2.str.split('_').str[1]

# get 只能传一个值 s2.str.split('_').str.get(1)

# [] 可以使用切片操作 s2.str.split('_').str[1:3] s2.str.split('_').str[:-2] # 如果不指定分隔符,会按空格进行分隔 s2.str.split() # 限制分隔的次数,从左开始,剩余的不分隔 s2.str.split(n=2)

 ##字符展开,使用 split 可以将分隔后的数据展开形成新的行内容。

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

 # 指定展开列数,n 为切片右值

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

#rsplit 和 split一样,只不过它是从右边开始分隔,如果没有n参数,rsplit和split的输出是相同的。 

s2.str.rsplit('_', expand=True, n=1)

 #使用正则,对于规则比较复杂的,分隔符处可以传入正则表达式:

s = pd.Series(["1+1=2"]) s.str.split(r"\+|=", expand=True)

 文本切片选择 slice

 #可以使用 .str.slice() 将指定的内容切除掉,不过还是推荐使用 s.str[]来实现,这样和Python字符串列表操作是一样的

s = pd.Series(["koala", "fox", "chameleon"]) s.str.slice() # 不做任何事 s.str.slice(1) # 切掉第一个字符 s.str.slice(start=1) #同上

 其他参数用法:

# 切除最后一个以前的,留下最后一个 s.str.slice(start=-1) # s.str[-1] # 切除第二位以后的 s.str.slice(stop=2) # s.str[:2] # 切除步长为2的内容 s.str.slice(step=2) # s.str[::2] # 切除从开头开始,第4位以后并且步长在3的内容 # 同 s.str[0:5:3] s.str.slice(start=0, stop=5, step=3)

划分 partition

#.str.partition可以将文本按分隔符号划分为三个部分,形成一个新的 DataFrame或者相关数据类型。

s = pd.Series(['Linda van der Berg', 'George Pitt-Rivers']) s.str.partition()

 其他:提示: 本文由整理自网络,如有侵权请联系本站删除!
本站声明:
1、本站所有资源均来源于互联网,不保证100%完整、不提供任何技术支持;
2、本站所发布的文章以及附件仅限用于学习和研究目的;不得将用于商业或者非法用途;否则由此产生的法律后果,本站概不负责!

-六神源码网