Удаление nltk стоп-слов из строк csv DataFrame

1

Я пытаюсь удалить стоп-слова из следующего 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: изменение названия для уточнения

Теги:
pandas
csv
nltk
corpus

2 ответа

0
Лучший ответ

Для этой цели вы можете использовать список. Здесь создается новая константа столбца. Значения 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=';') 
  • 0
    Это работает как шарм, спасибо большое!
-2

Функция 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 выглядит как точно.

Приветствия, Сайлас

  • 0
    Downvote не пришел от меня. Я пробую это прямо сейчас :)
  • 0
    Работал просто отлично, голосовал. Большое спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню