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

  • 本文关键字:单词 符号 条件 替换 pandas
  • 更新时间 :
  • 英文 :


我有一个数据帧,df 有 3 列:FirstCol,SecndColThirdCol我打算匹配第一列中的单词,如果单词以 up 结尾,这是FirstCol中的最后一个单词,请将SecndCol中的值:0226e0ad 替换为"0226e0af",并将最后一个符号<替换为"up">在第三列中。否则,如果最后一个单词以 down 结尾,请保留第二列的值,并将最后一个符号<*>替换为ThirdCol 中的"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                                                             
%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

关于如何做到这一点的任何想法?

一种方法是使用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')

最新更新