目录
一、Series 数据替换s.str.replace()
1. 普通查找替换
2.正则表达式替换
3. 预编译好的正则表达式替换
4. 函数替换
5. 分组替换
二、DataFrame 数据替换 df.replace()
1. 单值替换
2. 列表替换
3.字典替换
三、DataFrame 正则替换
1. 正则表达式‘零宽断言’介绍
2. 单值正则替换
3. 列表正则替换
4. 字典正则替换
四、DataFrame替换实例应用
总结
s.sr.replace(pat,repl,n=-1,case=None,flags=0,regex=None)
函数详解:
pat | 要查找的字符串 |
repl | 替换的字符串,可以调用函数 |
n | 要进行的替换数,默认全部 |
case | 是否区分大小写 |
flags | re模块中的标志 |
regex | 是否设置为正则表达式 |
将曹操替换为刘备
import pandas as pd
s=pd.Series(['曹操','大乔','小乔'])
s.str.replace('曹操','刘备')
将字符串中的‘~’和‘/’替换为'-'
import pandas as pd
s=pd.Series(['2022-5-5','2022/5/6','2022~6~9'])
s.str.replace('[~/]','-',regex=True)
将字符串中的‘~’和‘/’替换为'-'
import pandas as pd
import re
s=pd.Series(['2022-5-5','2022/5/6','2022~6~9'])
pat=re.compile('[~/]')
s.str.replace(pat,'-',regex=True)
给Series中的人名添加括号;人名和日期之间添加‘-’
import pandas as pd
import re
s=pd.Series(['Aaron2022-5-5','Bob2022-5-6','judy2022-6-9'])
s.str.replace('[a-zA-Z]+',lambda x: '('+x[0]+')'+'-',regex=True)
殊途同归,分组替换可以实现与函数替换一样的目的;
s=pd.Series(['Aaron2022-5-5','Bob2022-5-6','judy2022-6-9'])
s.str.replace('([a-zA-Z]+)',r"【\1】-",regex=True)
df.replace(to_replace=None,value=None,inplace=False,limit=None,regex=False,method='pad)
函数详解:
to_replace | 查找要替换的值 |
value | 替换与查找匹配的值 |
inplace | 修改原数据 |
limit | 向前或向后填充的最大尺寸间隙 |
regex | 是否支持正则表达式 |
method | 替换方法 |
写入实例数据:
df=pd.DataFrame({'英雄属性':['刺客','射手','法师','战士','辅助'],
'红方英雄':['荆轲','卤蛋','甄姬','夏侯惇','项羽'],
'红方伤害':[11.20,15.34,8.57,6.98,3.69],
'红方死亡次数':['1次','10次','8次','5次','6次'],
'蓝方英雄':['赵云','马克','干将','吕布','刘禅'],
'蓝方伤害':[10.82,11.36,10.87,9.69,6.53],
'蓝方死亡次数':['5次','8次','4次','7次','10次']})
df
将荆轲替换为孙悟空;
df.replace('荆轲','孙悟空')
多个值替换单个值,将赵云和马克替换为孙策
df.replace(['赵云','马克'],'孙策')
多个值替换多个值,将赵云和马克替换为橘右京和虞姬;
查找值放在一个列表里,替换值放在一个列表里,需要一一对应;
df.replace(['赵云','马克'],['橘右京','虞姬'])
(1)字典替换,将赵云和马克替换为橘右京和虞姬
传入字典的键为要查找的值,值为要替换的值;
df.replace({
'赵云':'橘右京',
'马克':'虞姬'
})
(2)指定列替换
将红方英雄甄姬替换为貂蝉,项羽替换为钟馗;蓝方英雄吕布替换为孙策,干将替换为杨玉环;
df.replace({
'红方英雄':{
'甄姬':'貂蝉',
'项羽':'钟馗'
},
'蓝方英雄':{
'吕布':'孙策',
'干将':'杨玉环'
}
})
(3)多列替换
将红方伤害11.2,蓝方伤害11.36,9.69替换为9.999
df.replace({'红方伤害':11.2,'蓝方伤害':[11.36,9.69]},9.999)
名称 | 表达式 | 解释 |
零宽正向先行断言 | (?=exp) | 匹配后面是exp表达式的字符串 |
零宽负向先行断言 | (?!exp) | 匹配后面不是exp表达式的字符串 |
零宽正向后行断言 | (?<=exp) | 匹配前面是exp表达式的字符串 |
零宽负向后行断言 | (? | 匹配前面不是exp表达式的字符串 |
在红方死亡次数和蓝方死亡次数数字和‘次’之间添加‘-’
df.replace(
to_replace='(^\d+)(?=\D)',
value=r'\1-',
regex=True
)
列表替换,给红方英雄添加‘【】’
df['红方英雄']=df['红方英雄'].replace(
regex=['^','$'],
value=['【','】'],
)
df
字典正则替换,给蓝方英雄添加‘[]’
df.replace(
regex={
'蓝方英雄':{'^':'[','$':']'}
})
原数据如下:英雄信息列后面数字为编号;
df=pd.DataFrame({'英雄属性':['刺客','射手','法师','战士','辅助'],
'英雄信息':['荆轲36','卤蛋1','甄姬6','夏侯惇10','项羽66'],
'红方英雄':['荆轲','卤蛋','甄姬','夏侯惇','项羽'],
'红方伤害':[11.20,15.34,8.57,6.98,3.69],
'红方死亡次数':['1次','10次','8次','5次','6次'],
'蓝方英雄':['赵云','马克','干将','吕布','刘禅'],
'蓝方伤害':[10.82,11.36,10.87,9.69,6.53],
'蓝方死亡次数':['5次','8次','4次','7次','10次']})
df
1.将编号统一为四位数字,不足四位的使用0补齐;
df['英雄信息'].str.replace(
pat='(\d+)',
repl=lambda x: '0'*(4-len(x[0]))+x[0],
regex=True
)
2. 给编号前面加上Timi,并使用‘-’分隔
df['英雄信息']=df['英雄信息'].str.replace(
pat='(\d+)',
repl=lambda x: '-Timi'+'0'*(4-len(x[0]))+x[0],
regex=True
)
df