pandas фильтровать текст в столбце в соответствии с данными в другом столбце - PullRequest
0 голосов
/ 26 мая 2020

Я готовлю текстовые данные социальных сетей. Два столбца выглядят следующим образом:

name                text
@dnsTV2             @raisa Bullshit!
Sebastian           @dnsTV2, are you kidding?
@raisa              @dnsTV2 thanks to corona...
imax468             @oksana what do you mean by that???
oksana              raisa! It is so true!

В 'text' первые одно или два слова - это псевдонимы людей, которым человек отвечает в своем комментарии (иногда начинающиеся с @, но не всегда). Все псевдонимы, на которые люди отвечают, находятся в каком-то месте в столбце 'name', потому что люди разговаривают друг с другом.

Моя задача - удалить эти имена и '@' из столбца 'text', сохранив при этом остальную часть текст.

Есть ли способ отфильтровать текст во втором столбце, используя содержимое первого?

Заранее спасибо!

1 Ответ

0 голосов
/ 26 мая 2020

Вот решение, использующее регулярное выражение. Он берет все имена из столбца имен и удаляет @. Затем он добавляет перед ними @?, что означает необязательный @ в регулярном выражении. Затем он объединяет их все с помощью |, что позволяет передать их все функции Series.str.replace, заменяя их пустыми строками. Это предполагает отсутствие согласованности между именами, имеющими @ в текстовом столбце и в столбце имени. Если есть, есть еще более простое решение.

import re

df = pd.DataFrame({
    'name': ['@dnsTV2', 'Sebastian', '@raisa', 'imax468', 'oksana', 'extra'],
    'text': ['@raisa Bullshit!', 
             '@dnsTV2, are you kidding?', 
             '@dnsTV2 thanks to corona...', 
             '@oksana what do you mean by that???', 
             'raisa! It is so true!',
             'this row has now nicknames']
})

regexes = '|'.join(['@?' + re.escape(name) for name in df.name.str.replace('@', '')])
df['text2'] = df['text'].str.replace(regexes, '')
df

        name                                 text  \
0    @dnsTV2                     @raisa Bullshit!   
1  Sebastian            @dnsTV2, are you kidding?   
2     @raisa          @dnsTV2 thanks to corona...   
3    imax468  @oksana what do you mean by that???   
4     oksana                raisa! It is so true!   
5      extra           this row has no nicknames   

                          text2  
0                     Bullshit!  
1            , are you kidding?  
2           thanks to corona...  
3   what do you mean by that???  
4              ! It is so true!  
5    this row has no nicknames  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...