пытаюсь заменить слова в наборе данных (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
Но опять же, минимальная воспроизводимость была бы полезна, поскольку она помогает понять, как в первую очередь форматируются ваши данные.