dfF:
Sample AlmostFinal
1 KOPLA234
1 KOPLA234
2 RWPLB253
3 MMPLA415
3 MMPLA415
我需要将KOPL
和RWP
和MM
替换为KOLPOL,最后一个字符a / b应该保留。因此结果应该是:
Sample AlmostFinal Final
1 KOPLA234 KOLPOLA234
1 KOPLA234 KOLPOLA234
2 RWPLB253 KOLPOLB253
3 MMPLA415 KOLPOLA415
3 MMPLA415 KOLPOLA415
我尝试通过替换来实现:
dfF['Final'] = (dfF['AlmostFinal'].replace({'KOPL':'KOLPOL'}, regex = True))
dfF['Final'] = (dfF['AlmostFinal'].replace({'RWP':'KOLPOL'}, regex = True))
dfF['Final'] = (dfF['AlmostFinal'].replace({'MMPL':'KOLPOL'}, regex = True))
并且:如果我评论第二和第三行替换了KOPL作品。
当我评论第1条和第3条时,请替换RWP。
但是,当我取消所有注释并尝试运行所有3行时,它们只能最后运行。为什么?在另一个脚本中,我有一个类似的代码,它可以同时更改整个和整行。
答案 0 :(得分:1)
您可以对replace
使用单个regex=True
通话:
df['Final'] = df['AlmostFinal'].replace(
[r'KOPL', r'RWP.*?(?=A|B)', r'MM.*(?=A|B)'], 'KOLPOL', regex=True)
df
Sample AlmostFinal Final
0 1 KOPLA234 KOLPOLA234
1 1 KOPLA234 KOLPOLA234
2 2 RWPLB253 KOLPOLB253
3 3 MMPLA415 KOLPOLA415
4 3 MMPLA415 KOLPOLA415
我们希望能够处理子字符串和最后一个字符之间的不同数量的字符,因此具有超前功能的正则表达式在这里很有用。
进一步的概括是可能的。只需定义您的子字符串,然后通过list comp插入前瞻即可。
pat = ['KOPL', 'RWP', 'MM']
df['Final'] = df['AlmostFinal'].replace(
[rf'{p}.*(?=A|B)' for p in pat], 'KOLPOL', regex=True) # need python3.6+
df
Sample AlmostFinal Final
0 1 KOPLA234 KOLPOLA234
1 1 KOPLA234 KOLPOLA234
2 2 RWPLB253 KOLPOLB253
3 3 MMPLA415 KOLPOLA415
4 3 MMPLA415 KOLPOLA415
如果要替换特定的子字符串,则解决方案要简单一些。
pat = ['KOPL', 'RWPL', 'MMPL']
df['AlmostFinal'].replace(pat, 'KOLPOL', regex=True)
0 KOLPOLA234
1 KOLPOLA234
2 KOLPOLB253
3 KOLPOLA415
4 KOLPOLA415
Name: AlmostFinal, dtype: object
不需要其他修改。有关更常规的替换,请参见上文。
答案 1 :(得分:1)
您应该执行一项任务,而不是三项。否则,每个下一个作业都会覆盖上一个作业的结果。
dfF['Final'] = dfF['AlmostFinal']\
.replace({'KOP|RWP|MMP': 'KOLPO'}, regex = True)
答案 2 :(得分:1)
并且:如果我评论第二行和第三行替换KOPL作品。当我评论第1条和第3条时,请替换RWP。但是,当我取消注释所有内容并尝试运行所有3行时,它们只会最后运行。为什么?
因为replace创建了一个新的数据框,并且由于您总是在一个原始数据框上进行替换,所以每次替换都会丢弃前一个数据框的结果。
同时进行所有替换,例如使用正则表达式,或者我猜一个具有多个值的字典(不确定在这里为什么要对单个值使用字典:
{
'KOPL':'KOLPOL',
'RWP':'KOLPOL',
'MMP':'KOLPOL',
}
或对上一个的结果进行每次替换(链式替换,或者第二个和第三个应该对df['Final']
起作用)