python中的replace函数给出错误的结果

时间:2019-06-28 06:07:02

标签: python pandas dataframe

dfF:

    Sample  AlmostFinal  
    1          KOPLA234        
    1          KOPLA234
    2          RWPLB253
    3          MMPLA415
    3          MMPLA415 

我需要将KOPLRWPMM替换为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行时,它们只能最后运行。为什么?在另一个脚本中,我有一个类似的代码,它可以同时更改整个和整行。

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']起作用)