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

Pandas 根据条件替换多列中的单词和符号,pandas,Pandas,我有一个数据框,df有3列:FirstCol,SecndColThirdCol。我打算匹配第一列中的单词,如果单词以up结尾,这是FirstCol中的最后一个单词,将第二列中的值:0226e0ad替换为“0226e0af”,并将第三列中的最后一个符号替换为“up”。 否则,如果最后一个单词以down结尾,则保留第二列的值,并将第三个字符中的最后一个符号替换为“down” 注意:还有其他以“向上”和“向下”结尾的消息,我不打算更改,例如: %PKT_INTTT-LITT-3-UPDOWN : g

我有一个数据框,df有3列:FirstColSecndColThirdCol。我打算匹配第一列中的单词,如果单词以up结尾,这是FirstCol中的最后一个单词,将第二列中的值:0226e0ad替换为“0226e0af”,并将第三列中的最后一个符号替换为“up”。 否则,如果最后一个单词以down结尾,则保留第二列的值,并将第三个字符中的最后一个符号替换为“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 <*>
%PKT_INTTT-LITT-3-UPDOWN:gate txE0/4/1/4,状态更改为Down,8bea0c5d,%PKT_INTTT-LITT-3-UPDOWN gate状态更改为
PKT_INTTT-LITT-3-UPDOWN:闸门TXE0/2/1/7,状态更改为Up,8bea0c5d,%PKT_INTTT-LITT-3-UPDOWN闸门状态更改为
但只应更改第一列中的消息

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:门txE1/1/1/1上的Sig列,状态更改为Up
%TTT_IND-LITEALL-5-UPDOWN:门txE1/16/1/4上的Sig列,状态更改为Down
森德科尔
0226e0ad%TTT_IND-LITEALL-5-UPDOWN:栅极上的Sig col状态更改为
0226e0ad%TTT_IND-LITEALL-5-UPDOWN:栅极上的Sig col状态更改为
现在,这将给出:

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
FirstCol
%TTT_IND-LITEALL-5-UPDOWN:门txE1/1/1/1上的Sig列,状态更改为Up
%TTT_IND-LITEALL-5-UPDOWN:门txE1/16/1/4上的Sig列,状态更改为Down
森德科尔
0226e0af%TTT_IND-LITEALL-5-UPDOWN:栅极上的Sig col状态更改为Up
0226e0ad%TTT_IND-LITEALL-5-UPDOWN:栅极上的Sig col状态更改为Down

关于如何实现这一点有什么想法吗?

一种方法是使用创建掩码并使用替换值

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')

谢谢@Abhi!但是,FirstCol还有其他字符串,它们有上下两个字符,我不想更改,除非它与上面在FirstCol@Bode这就是我使用
regex
仅在末尾匹配单词的原因。你可以核实一下。它会起作用的。它只会在
第一列的末尾查找
向上
向下
,但它更改了一些其他消息,这些消息的最后一个字是向上和向下too@Bode您能否通过添加导致问题的1或2行来更新上述问题?好的!非常感谢。
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')