Удалить слово в строке на основе значения другого столбца - PullRequest
1 голос
/ 28 мая 2020

У меня есть два столбца, которые представляют собой комбинацию слов, разделенных запятыми, и отдельных слов в строковом формате. col1 всегда будет содержать только одно слово. В этом примере я буду использовать слово Dog в качестве слова в col1, но оно будет отличаться от реальных данных, поэтому, пожалуйста, не делайте решение, которое использует регулярное выражение для Dog в частности.

df = pd.DataFrame({"col1": ["Dog", "Dog", "Dog", "Dog"],
                     "col2": ["Cat, Mouse", "Dog", "Cat", "Dog, Mouse"]})

Я хочу проверить, появляется ли слово из col1 в строке col2, и если оно есть, я хочу удалить это слово из col2. Но имейте в виду, что я хочу сохранить оставшуюся часть строки, если осталось больше слов. Таким образом, будет go отсюда:

    col1    col2    
0   Dog     Cat, Mouse
1   Dog     Dog
2   Dog     Cat
3   Dog     Dog, Mouse

На это:

    col1    col2
0   Dog     Cat, Mouse
1   Dog 
2   Dog     Cat
3   Dog     Mouse

Ответы [ 3 ]

2 голосов
/ 28 мая 2020

Попробуйте следующее:

import re
df['col2'] = [(re.sub(fr"({word}[\s,]*)","",sentence)) 
             for word,sentence in zip(df.col1,df.col2)]
df

    col1    col2
0   Dog     Cat, Mouse
1   Dog 
2   Dog     Cat
3   Dog     Mouse

другой df, с собакой посередине:

df = pd.DataFrame({"col1": ["Dog", "Dog", "Dog", "Dog","Dog"],
                     "col2": ["Cat, Mouse", "Dog", "Cat", "Dog, Mouse", "Cat, Dog, Mouse"]})

df


   col1     col2
0   Dog     Cat, Mouse
1   Dog     Dog
2   Dog     Cat
3   Dog     Dog, Mouse
4   Dog     Cat, Dog, Mouse

Примените код выше:

   col1     col2
0   Dog     Cat, Mouse
1   Dog 
2   Dog     Cat
3   Dog     Mouse
4   Dog     Cat, Mouse
1 голос
/ 28 мая 2020

l=df.col1.tolist() # список col1

Создать набор из col2, оценить членство l в наборе, найдя разницу с применением лямбда-функции.

df['col2']=list(zip(df.col2))
df['col2']=df.col2.apply(lambda x:[*{*x}-{*l}]).str[0]

enter image description here

1 голос
/ 28 мая 2020

(^,|,$) для обработки начальной и конечной запятой
(,\s|,) удалит запятые, оставшиеся после операции замены.
{1,} для пропустить неповторяющуюся запятую

df['col2'] = df['col2'].str. \
    replace("|".join(df['col1'].unique()), "").str.strip() \
    .str.replace("(?:^,|,$)", "") \
    .str.replace("(?:,\s|,){1,}", ",")

  col1          col2
0  Dog     Cat,Mouse
1  Dog              
2  Dog           Cat
3  Dog   Mouse,Mouse
...