Python Pandas - Lambda применяют сохранить первоначальный формат - PullRequest
0 голосов
/ 27 июня 2018

Я бы хотел трансформировать эту серию

from nltk import word_tokenize, pos_tag
from nltk.corpus import stopwords
stop_words = set(stopwords.words("english"))
df = pd.Series([["comic of book", "horror of movie"], ["dark", "dark french"]])
>> 0  [comic of book, horror of movie]
>> 1  [dark, dark french]

, удалив stopwords и сохранив только существительные (NN в nltk). Я думаю, что функция apply является лучшим решением, однако применение ее непосредственно к этим текстам приводит к потере информации. Я получаю это

df.apply(lambda x: [wrd for ing in x for wrd in word_tokenize(ing) if wrd not in stop_words])
0    [comic, book, horror, movie]
1            [dark, dark, french]

вместо

0    [comic book, horror movie]
1            [dark, dark french]

Я что-то упускаю в for loop, и каждый bag of words разделяется на уникальный words (может быть, apply здесь нехорошо)

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Если производительность важнее элегантности, классический алгоритм может помочь.

Следующий код никогда не победит в конкурсе красоты, но он примерно на 350 - 400% более эффективен (на моем ThinkPad), чем, по общему признанию, очень хороший подход к пониманию списков. Разрыв будет расти с размером вашего набора данных, так как он работает с более примитивным типом данных (списками) и, в конце концов, преобразуется обратно в панд.

temp_list = list()

for serie in df:
    elements = list()
    for element in serie:
        for word in element.split():
            if word in stop_words:
                element = element.replace(f' {word} ', ' ')

        elements.append(element)

    temp_list.append(elements)

df = pd.Series(temp_list)
print(df)

Выбор за вами:)

0 голосов
/ 27 июня 2018
def rmsw(y):
    return ' '.join(set(y.split()) - stop_words)

pd.Series([[rmsw(y) for y in x] for x in df], df.index)

0    [comic book, horror movie]
1           [dark, dark french]
dtype: object

Для поддержания порядка и частоты

def rmsw(y):
    return ' '.join([w for w in y.split() if w not in stop_words])

pd.Series([[rmsw(y) for y in x] for x in df], df.index)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...