根据条件替换多列中的单词和符号

时间:2018-10-22 02:26:38

标签: pandas

我有一个包含3列的数据框,df: FirstCol SecndCol ThirdCol 。我打算匹配Firstcolumn中的单词,如果该单词以 up 结尾( FirstCol 中的最后一个单词),则替换值: 0226e0ad SecndCol 中用''0226e0af''并将最后一个符号 << em >> 替换为“上” 。 否则,如果最后一个单词以向下结尾,则保留第二列的值,并替换最后一个符号 <*> 在ThirdCol中使用''down''

注意:还有一些我不想更改的消息也以Up和Down结尾:

 %PKT_INTTT-LITT-3-UPDOWN : gate txE0/4/1/4, changed state to Down,8bea0c5d,%PKT_INTTT-LITT-3-UPDOWN gate <*> changed state to <*>
 PKT_INTTT-LITT-3-UPDOWN : gate txEE0/2/1/7, changed state to Up, 8bea0c5d,%PKT_INTTT-LITT-3-UPDOWN gate <*> changed state to <*>

但是只更改FirstCol中的消息

FirstCol                                                             
%TTT_IND-LITEALL-5-UPDOWN : Sig col on gate txE1/1/1/1 , changed state to Up          
%TTT_IND-LITEALL-5-UPDOWN : Sig col on gate txE1/16/1/4, changed state to Down



SecndCol                    ThirdCol
0226e0ad         %TTT_IND-LITEALL-5-UPDOWN : Sig col on gate <*> changed state to <*>   
0226e0ad         %TTT_IND-LITEALL-5-UPDOWN : Sig col on gate  <*> changed state to <*>   

现在将给出:

FirstCol                                                             
%TTT_IND-LITEALL-5-UPDOWN : Sig col on gate txE1/1/1/1 , changed state to Up         
%TTT_IND-LITEALL-5-UPDOWN : Sig col on gate txE1/16/1/4, changed state to Down



  SecndCol                    ThirdCol
  0226e0af         %TTT_IND-LITEALL-5-UPDOWN : Sig col on gate <*> changed state to Up   
  0226e0ad         %TTT_IND-LITEALL-5-UPDOWN : Sig col on gate  <*> changed state to Down

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:1)

一种方法是使用str.contains创建掩码并使用str.replace替换值。

mask1 = df['FirstCol'].str.contains(r'Up$|Up.', regex=True)
mask2 = df['FirstCol'].str.contains(r'Down$|Down.', regex=True)

cond = df['FirstCol'].str.contains(r'-LITT-',regex=True)

df.loc[mask1 & ~cond, 'SecndCol'] = '0226e0af'
df.loc[mask1 & ~cond, 'ThirdCol'] = df.loc[mask1, 'ThirdCol'].str.replace(r'(\<\*\>)$', 'Up')

df.loc[mask2 & ~cond, 'ThirdCol'] = df.loc[mask2, 'ThirdCol'].str.replace(r'(\<\*\>)$', 'Down')