python中的replace函数给出错误的结果
dfF: 我需要将python中的replace函数给出错误的结果,python,pandas,dataframe,Python,Pandas,Dataframe,dfF: 我需要将KOPL和RWP和MM替换为KOLPOL,最后一个字符a/b应该保留。因此,结果应该是: Sample AlmostFinal 1 KOPLA234 1 KOPLA234 2 RWPLB253 3 MMPLA415 3 MMPLA415 我试图通过替换来实现: Sample AlmostFinal Fin
KOPL
和RWP
和MM
替换为KOLPOL,最后一个字符a/b应该保留。因此,结果应该是:
Sample AlmostFinal
1 KOPLA234
1 KOPLA234
2 RWPLB253
3 MMPLA415
3 MMPLA415
我试图通过替换来实现:
Sample AlmostFinal Final
1 KOPLA234 KOLPOLA234
1 KOPLA234 KOLPOLA234
2 RWPLB253 KOLPOLB253
3 MMPLA415 KOLPOLA415
3 MMPLA415 KOLPOLA415
和:如果我对KOPL工程的第2行和第3行进行注释,则替换为。当我评论RWP工程的第1次和第3次更换时
但是当我取消注释全部并尝试运行所有3行时,只会在最后运行。为什么?在另一个脚本中,我有一个类似的代码,它会在整个过程中发生变化,而整行代码都会工作 您可以使用单个
替换调用为regex=True
:
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))
我们希望能够处理子字符串和最后一个字符之间不同数量的字符,因此带lookahead的正则表达式在这里很有用
进一步推广是可能的。只需定义子字符串,然后通过list comp插入一个前瞻
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
如果要替换特定的子字符串,解决方案就简单一点
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
和:如果我对KOPL工程的第2行和第3行进行评论。当我评论RWP工程的第1次和第3次更换时。但当我取消注释全部并尝试运行所有3行时,只会在最后一行运行。为什么?
因为replace创建了一个新的数据帧,而且您总是在一个原始数据帧上进行替换,所以每次替换都会丢弃前一个数据帧的结果
要么同时进行所有替换,例如使用正则表达式,要么我猜是一个具有多个值的dict(不确定为什么在这里使用dict表示单个值真的:
{
“KOPL”:“KOLPOL”,
“RWP”:“KOLPOL”,
‘MMP’:‘KOLPOL’,
}
或者在前一次的结果上执行每次更换(链条更换或第二次和第三次应在df['Final']
上进行).由于与前面提到的相同的原因不起作用。无法保证所列子字符串后面的内容。@cs95 OP中存在不一致。操作的描述与预期结果不匹配。如何将“MMPLA415”中的“MM”替换为“KOLPOLA415”?已编辑。MMPLA->kolpola代码不存在的原因之所以这样做是因为最后一行覆盖了前两行的结果。请您解释一下,您是在尝试替换所有以MM开头直到最后一个字符的字符串,还是MMPL,或者是什么?仍然是错误的。在RWPLB253中,将RWP替换为KOLPOLB253会使其成为KOLPOLLB253,而不是KOLPOLB253@cs95它确实产生了预期的输出在OPs编辑之后。这让人困惑,但我想我们必须等他们说:)非常感谢你的例子和解释。这很有用!:)
dfF['Final'] = dfF['AlmostFinal']\
.replace({'KOP|RWP|MMP': 'KOLPO'}, regex = True)