pandas 学习笔记11 文本处理

1 数据类型 object or string(需专门指定) 和字符操作

df = pd.DataFrame({
    'A':['1',2],
    'B':['c','c']
})

df.convert_dtypes().dtypes #类型转换,支持strings
df.astype('string').dtypes #转化string

#字符的操作
# .str访问器
s = pd.Series(['A','Boy','C',np.nan],dtype='string')
s.str.lower() #转为小写 
# df.Q1.astype(str).str #转为object
# df.team.astype('string').str #转为strings
# 如果对数据连续字符操作,则每个操作都要使用.str方法
# eg:移除字符串头尾空格、小写、替换下划线
# df.columns.str.strip().str.lower().str.replace(' ','_')
#文本格式
s.str.lower() #转为小写,upper() 大写,title()标题模式,全大写,capitalize 首字母大写, swapcase() 大小写互换
#文本对齐
s.str.center(10,fillchar='-') #居中对齐,宽度为10,用‘-’填充(ljust-左对齐,rjust-右对齐
s.str.pad(width=10,side='left',fillchar='-') #side in [left,right,both]
s.str.zfill(3) #生成字符,不足三位的在前面加0
#计数和编码
s.str.count('a') #字符串中指定字符的数量
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.isnumeric() #是否为0-9的数字
s.str.isalnum() #字符或数字
s.str.isdigit() #是否数字
s.str.isdecimal() #是否小数
s.str.isspace() #是否空格
s.str.islower()#是否小写

2 文本高级处理

#文本分隔
s = pd.Series(['天_地_人','你_我_他',np.nan,'风_水_火'],dtype='string')
s.str.split('_')#用下划线分隔
s.str.split('_').str[1] #取出第二个
s.str.split('_').get(1) #get只能传入一个值
s.str.split('_').str[1:3] #切片操作
s.str.split()#按空格进行分隔
s.str.split('_',n=1) #限制分隔次数,从左开始,剩下的不分隔

s.str.split('_',expand=True)#分隔后展开为df
s.str.split('_',expand=True,n=1) #指定展开列数
s.str.rsplit('_',expand=True,n=1) #从右分隔成两部分
s = pd.Series(['你和我及她'])
s.str.split(r'\和|及',expand=True) #利用正则

s = pd.Series(['sun','moon','star'])
s.str.slice(1) #切掉第一个字符
s.str.slice(start=1) #同上
s.str.slice() #什么也不做
s.str.slice(-1) #s.str[-1] 保留最后一个,切掉前面的
s.str.slice(stop=2) #s.str[:2] 切掉第二位以后的
s.str.slice(step=2)#切掉步长为二的内容,s.str[::2]
s.str.slice(start=0,stop=5,step=3) #s.str[:5:3]

#.str.partition 将文本按分隔符划分为三部分,分隔符占一部分
s = pd.Series(['How are you','What are you doing'])
s.str.partition() #从右按空格划分
s.str.partition('are') #指定字符
s.str.partition('you',expand=False) #返回元组
idx =pd.Index(['A 123','B 345'])
idx.str.partition() #对索引进行划分
#.str.replace() 
s =pd.Series(['10','-$20','$3,000'],dtype='string')
s.str.replace('$','') #将¥替换为空
s.str.replace(r'$|,','') #去掉¥和,
#.str.slice_replace()指定替换
s = pd.Series(['ax','bxy','cxyz'])
s.str.slice_replace(1,repl='T') #只保留第一个字符,其他用T替换
s.str.slice_replace(stop=2,repl='T') #指定位置前
s.str.slice_replace(start=1,stop=2,repl='T') #指定区间

#.str.repeat()#重复替换
s=pd.Series(list('abc'))
s.repeat(2) #整体重复两次
s.str.repeat(repeats=2) #每行重复两次
s.str.repeat(repeats=[1,2,3]) #指定每行重复次数,对于自然索引顺序
#s.str.cat() 文本连接
s = pd.Series(list('xyz'),dtype='string')
s.str.cat() #默认无符号连接 'xyz'
s.str.cat(sep=',') #用逗号连接

t= pd.Series(['h','i',np.nan,'k'],dtype='string')
t.str.cat(sep=',') #忽略空值
t.str.cat(sep=',',na_rep='-')#np.nan由-替换

pd.concat([s,t],axis=1) #使用pd.concat连接
s.str.cat(pd.concat([s,t],axis=1),na_rep='-') #两次连接   xxh
h = pd.Series(list('bda'),index=[1,0,2],dtype='string')
s.str.cat(h) #以左边的索引为准 0    xd
s.str.cat(h,join='right') #以右边的索引为准 其他outer inner方式
#.str.findall() 文本查询 .str.find() 返回匹配结果的位置,-1为不匹配 .str.rfind()匹配到第一个就返回
s=pd.Series(['One','Two','Three'])
s.str.findall('T') #查询字符
s.str.findall('ONE')
import re
s.str.findall('ONE',flags=re.IGNORECASE) #忽略大小写
s.str.findall('o')#包含o,包含多个返回列表
s.str.findall('o$') #以o结尾
#文本包含 .str.contains() .str.startswith() .str.endswith()
s=pd.Series(['One','Two','Three',np.nan])
s.str.contains('o',regex=False) #是否包含,关闭正则
#用于数据查询中
df.loc[df.name.str.contains('A')]
df.loc[df.name.str.contains('A|C')]
df.loc[df.name.str.contains('A|C',flags=re.IGNORECASE)]
df.loc[df.name.str.contains('\d')]
s.str.startswith('O',na=False) #空值以False代替
#.str.match() 字符串是不是与正则表达式相匹配
pd.Series(['1','2','3a','3b','03c'],dtype='string').str.match(r'[0-9][a-z]')
#文本提取.str.extract()
#以下代码利用正则表达式将文本分成两部分,第一部分匹配a、b两个字母,第二部分匹配数字,最后形成两列。c3无法匹配,最后都是na
(pd.Series(['a1','a2','c3'],dtype='string')
.str.extract(r'([ab])(\d)',expand=True)) #expand为False,只有一列时才返回s
s = pd.Series(['a1','a2','c3'])
s.str.extract(r'(?P<letter>[ab])(\d)') #取正则组的命名为列名
#匹配全部将形成多层索引的数据
s = pd.Series(['a1a2','b1b7','c1'],dtype='string',index=['A','B','C'])
two_groups='(?P<letter>[a-z])(?P<digit>[0-9])'
s.str.extract(two_groups) #单次匹配
s.str.extractall(two_groups)#多层索引数据
#提取虚拟变量
s = pd.Series(['a/b','b/c',np.nan,'c'],dtype='string')
s.str.get_dummies(sep='/') #提取虚拟
idx = pd.Index(['a/b','b/c',np.nan,'c'])
idx.str.get_dummies(sep='/')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值