Замена слов и символов в нескольких столбцах в зависимости от условия - PullRequest
0 голосов
/ 22 октября 2018

У меня есть фрейм данных, df с 3 столбцами: FirstCol , SecndCol ThirdCol .Я намерен сопоставить слова в первом столбце, и если слово заканчивается на up , которое является последним словом в FirstCol , замените значение: 0226e0ad в SecndCol с '' 0226e0af '' и заменить последний символ <<em>> на '' up '' в 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

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 голосов
/ 22 октября 2018

Один из способов - создать маску с 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...