从数据框列中删除部分字符串

时间:2019-07-16 16:59:16

标签: python pandas

Replacing part of string in python pandas dataframe

类似的问题

但是它不起作用!?

佩纳斯23.4

给出以下df列:

    Expression
    XYZ&(ABC|DEF)
   (HIJ&FTL&JKK)&(ABC|DEF)
   (FML|AXY|AND)&(ABC|DEF)

我想去除每个列中可能包含的子字符串。

flag = '(ABC|DEF)'
andFlag = '&' + flag #the reasoning for doing this is that 'flag' may change


#Below are all different ways I have tried to achieve this, none have worked. 
df['Expression'] = df['Expression'].replace(andFlag, '', regex=True)
df['Expression'] = df['Expression'].apply(lambda x: re.sub(andFlag, '', x))
df['Expression'] = df['Expression'].replace(to_replace=andFlag, value= '', regex=True)
df['Expression'] = df['Expression'].str.replace(andFlag, '')
df['Expression'] = df['Expression'].str.replace(andFlag, '', regex=True)

在没有使用regex=True的情况下,我尝试了所有这些功能,但均无济于事。

预期输出:

    Expression
    XYZ
   (HIJ&FTL&JKK)
   (FML|AXY|AND)

试图弄清楚这一点我会发疯,这看起来是如此简单明了。

2 个答案:

答案 0 :(得分:2)

括号和竖线是正则表达式中的特殊字符,因此,如果要匹配这些字符,可以在前面加上反斜杠'\',例如:

flag = '\(ABC\|DEF\)' #see this is changed
andFlag = '&' + flag
print (df['Expression'].replace(andFlag, '', regex=True))

0              XYZ
1    (HIJ&FTL&JKK)
2    (FML|AXY|AND)
Name: Expression, dtype: object

答案 1 :(得分:2)

使用str.replace,更重要的是,将regex=False设置为文字匹配:

df['Expression'] = df['Expression'].str.replace(andFlag, '', regex=False)

      Expression
0            XYZ
1  (HIJ&FTL&JKK)
2  (FML|AXY|AND)