我有一个数据帧,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')