我有一个包含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
关于如何解决这个问题的任何想法?
答案 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')