пытаюсь заменить слова в наборе данных (DataFrame)

Я пытаюсь поместить в свой набор данных какой-то заполнитель для определенных слов. Однако мой метод, похоже, ничего не делает. Я не получаю сообщение об ошибке, но он также не делает того, что должен. Что я здесь делаю не так?

КОД:

      wordlist_urls =['co','https','http', 'www']
wordlist_news = ['nrc','volkskrant','ad', 'telegraaf', 'dagblad','courant']
wordlist_socials = ['twitter','instagram','linkedin', 'blog', 'twitteraccount']
wordlist_links = ['GroenLinks','sp','bij1', 'pvda', 'pvdd', 'DENK']
wordlist_rechts = ['FvD','VVD','PvdA', 'CDA', 'ja21', 'CU', 'SGP', 'Volt', 'bvnl']
wordlist_uni = ['uva','vu','rug', 'university', 'universiteit', 'Utrecht University', 'Leiden university', 'UU']

written_news['placeholders'] = written_news['user_description_clean'].replace(wordlist_urls,'URL')
written_news.loc['placeholders'] = written_news.loc['placeholders'].replace(wordlist_news,'NEWSPAPERS')
written_news.loc['placeholders'] = written_news.loc['placeholders'].replace(wordlist_socials,'SOCIALS')
written_news.loc['placeholders'] = written_news.loc['placeholders'].replace(wordlist_links,'POL_L')
written_news.loc['placeholders'] = written_news.loc['placeholders'].replace(wordlist_rechts,'POL_R')
written_news.loc['placeholders'] = written_news.loc['placeholders'].replace(wordlist_uni,'UNI')

written_news['placeholders']

Я попробовал использовать метод replace(), я ожидал, что слова в списке слов будут отображаться в данных как вновь определенное слово. Однако слова в наборе данных все еще не изменились.

2 ответа

Ключевое слово inplace может помочь здесь. Простой пример:

      import pandas as pd
df = pd.DataFrame({"A":[1,2,3,4], "B": ["foo1","foo2","foo3", "bar"]})
foos = ["foo1","foo2","foo3"]
df["B"].replace(foos, "foo", inplace=True)

Печать df вернет:

      >>print(df)  
 A    B
0  1  foo
1  2  foo
2  3  foo
3  4  bar

Трудно найти решение, если вы не сообщите нам, как форматируются ваши данные.

Глядя на ваш другой вопрос здесь, в StackOverflow, одна из проблем может заключаться в том, что ваш столбец называетсяuser_description_cleanпредставляет собой серию списков панд (список списков). При этом каждая строка представляет собой токенизированную строку, хранящуюся в виде списка слов в Python. Или, возможно, это всего лишь одна строка?

В любом случае вы могли бы рассмотреть возможность создания функции, в которой вы будете искать слова с помощью регулярных выражений. Затем вы можете использовать.apply()иlambda: xчтобы заменить слова в каждой строке вашего фрейма данных.

Это будет выглядеть так:

      #import the packages
import pandas as pd
import re

#example mock-up data
written_news=pd.DataFrame({'user_description_clean': [["voorbeeld", "volkskrant", "achtuurjournaal", "telegraaf", "dagblad", "media"],
                                                      ["courant","krantje", "dagblad", "nrc", "media"],
                                                      ["nrc", "volkskrant", "algemeen", "dagblad", "NRC"],
                                                      ["python", "pandas", "numpy", "big", "data"],
                                                      ["python", "bs4", "spacy", "tensorflow"]]})

wordlist_news = ['nrc','volkskrant', 'telegraaf', 'dagblad','courant']

#create your function
def placeholder_maker(sentence, wordlist, placeholder):
    sentence=" ".join(sentence) #only if your data are formatted as list of tokens. If your data is just a sentence, comment this line out.
    for word in wordlist:
        if word in sentence:
            sentence=re.sub(word, placeholder, sentence)
    return sentence.split() #Or return sentence if you don't want a tokenized sentence again

#run the function with .apply() and lambda 
written_news['placeholder'] = written_news['user_description_clean'].apply(lambda row: placeholder_maker(sentence=row, wordlist=wordlist_news, placeholder="NEWSPAPERS"))

#print the result
print(written_news['placeholder'])

вывод будет выглядеть так:

      >>> print(written_news['placeholder'])
0    [voorbeeld, NEWSPAPERS, achtuurjournaal, NEWSP...
1    [NEWSPAPERS, krantje, NEWSPAPERS, NEWSPAPERS, ...
2    [NEWSPAPERS, NEWSPAPERS, algemeen, NEWSPAPERS,...
3                   [python, pandas, numpy, big, data]
4                     [python, bs4, spacy, tensorflow]
Name: placeholder, dtype: object

Если у вас есть другой список, вы просто измените входные данные для своих аргументов следующим образом:

      #second wordlist
wordlist_python =['python', 'pandas','spacy','tensorflow']

#update the placeholder column
written_news['placeholder'] = written_news['placeholder'].apply(lambda row: placeholder_maker(sentence=row, wordlist=wordlist_python, placeholder="MACHINELEARNING")) 

#print the result   
print(written_news['placeholder'])

что приводит к:

      >>> print(written_news['placeholder'])
0    [voorbeeld, NEWSPAPERS, achtuurjournaal, NEWSP...
1    [NEWSPAPERS, krantje, NEWSPAPERS, NEWSPAPERS, ...
2    [NEWSPAPERS, NEWSPAPERS, algemeen, NEWSPAPERS,...
3    [MACHINELEARNING, MACHINELEARNING, numpy, big,...
4    [MACHINELEARNING, bs4, MACHINELEARNING, MACHIN...
Name: placeholder, dtype: object

Но опять же, минимальная воспроизводимость была бы полезна, поскольку она помогает понять, как в первую очередь форматируются ваши данные.

Другие вопросы по тегам