Напишите лямбда-функцию в функцию

#python #pandas

Вопрос:

У меня есть такая лямбда-функция:

 from Sastrawi.Stemmer.StemmerFactory import StemmerFactory

factory = StemmerFactory()
stemmer = factory.create_stemmer()

df['tweets_stemming'] = df['tweets_stopwords'].apply(lambda x: [stemmer.stem(stem) for stem in x])
 

И я хочу преобразовать эту лямбда-функцию в функцию, поэтому я пишу это:

 from Sastrawi.Stemmer.StemmerFactory import StemmerFactory

def stemmer_remover(stemming):
  factory = StemmerFactory()
  stemmer = factory.create_stemmer()
  stemming = [stemmer.stem(stemming) for stemming in df['tweets_stopwords']]

  return stemming

df['tweets_stemming'] = df['tweets_stopwords'].apply(stemmer_remover)
 

При использовании лямбда-функции мой код работает нормально. Но, если используется функция (не лямбда), выдающая ошибку TypeError: descriptor 'lower' requires a 'str' object but received a 'list' . Итак, я думаю, потому что мой фрейм данных панд из df['tweets_stopwords'] (см. Изображение)

Как это исправить?

колонка tweet_stopwords

Комментарии:

1. По вашим собственным словам, когда вы используете .apply , сколько раз, по вашему мнению, вызывается переданная функция? Как вы думаете, что ему передается? По вашим собственным словам, в вашей версии кода, использующего функцию, как, по-вашему, функция использует переданный параметр?

2. Лямбда-выражение lambda <args>: <lambda body> может быть просто заменено на def some_name(<args>): return <lambda body>

Ответ №1:

Ваша именованная функция работает не так, как ваша lambda .

 lambda x: [stemmer.stem(stem) for stem in x]
 

это то же самое, что:

 def stemmer_remover(x):
    return [stemmer.stem(stem) for stem in x]
 

Если вы замените свое лямбда-выражение на приведенное выше stemmer_remover , вы обнаружите, что оно ведет себя точно так же.