Я пытаюсь удалить стоп-слова из следующего DataFrame, прочитанного из.csv. Это в основном длинный список биграмм и частота их появления в наборе данных ярлыков шампуней.
Цель состоит в том, чтобы удалить всю строку, когда в слове "word1" или "word2" появляется секундомер.
word1 word2 frequency
0 nicht in 3069
1 wenn sie 2729
2 von kindern 2108
3 die hände 2094
4 darf nicht 2091
5 hände von 2091
6 citric acid 2088
7 kindern gelangen 2082
8 sie einen 2053
9 mit den 2023
10 eine reaktion 1976
Тем не менее, мне даже не удалось удалить строку, основанную только на столбце "word1", когда она совпадает с немецким секундомером из nltk.
Код я использую основанный на предыдущий вопрос ответил здесь.
import pandas as pd
from nltk.corpus import stopwords
stop = stopwords.words('german')
df = pd.read_table("myfile.csv", sep=";")
df.columns = ["word1","word2","frequency"]
df["word1"] = df["word1"].apply(lambda x: ' '.join([word for word in x.split() if word not in (stop)]))
print(df)
Ошибка, которую я получаю: AttributeError: объект "list" не имеет атрибута "split"
Я полностью понимаю, что я виноват здесь, потому что не понимаю вызываемую функцию. Я пытаюсь развить понимание pandas & nltk, пока я делаю курс на стороне, но это никуда не денется :)
Как только DataFrame очищается от стоп-слов, цель состоит в том, чтобы записать его в новый CSV. Но это на более позднем этапе.
EDIT: изменение названия для уточнения
Для этой цели вы можете использовать список. Здесь создается новая константа столбца. Значения temp являются False, если какое-либо из слов1 или word2 находится в состоянии остановки. Удалите те строки, значение темпа которых False. Наконец, отмените этот столбец temp и напишите в новый файл csv. Надеюсь это поможет.
import pandas as pd
from nltk.corpus import stopwords
stop = stopwords.words('english')
df = pd.read_csv("myfile.csv", sep=";")
df["temp"] = [True if row.word1 not in stop and row.word2 not in stop else False for index, row in df.iterrows()]
df = df[df.temp == True]
df.drop('temp', axis=1, inplace=True)
df.to_csv("myfile_out.csv", sep=';')
Функция apply не удаляет строки. Он просто отображает функцию на каждый элемент серии df ["word1"]. Кроме того, ваши записи в столбце "word1", по-видимому, относятся к типу, а не к строке типа.
Однако, если df были пандами DataFrame, содержащими столбец "word1" со строками в нем, просто сделайте это
df = df[~df["word1"].isin(stop)]
... и вы удаляете все записи из df, где "word1" останавливается. Здесь ~ - оператор отрицания, поэтому это означает, что нет. Метод some_series.isin(some_iterable) возвращает серию с теми же индексами, что и some_series, где каждая запись является логической, указывающей, содержится ли соответствующая запись в some_series в some_iterable.
Как правило, вы можете выбирать фрагменты из DataFrame с помощью
df[Series of booleans]
где "Серия" означает серию панд. Поскольку серия pandas работает со сравнительными операторами, вы можете делать такие вещи, как
df[df["frequency"] > 2060]
который возвращает DataFrame, содержащий только строки с частотным значением выше 2060.
EDIT: Я не уверен, что downvote пришел от вас, но если код, представленный здесь, не работает, вы должны показать несколько строк вашего CSV файла, потому что из вашего кода мы не можем знать, что ваш DataFrame выглядит как точно.
Приветствия, Сайлас