#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']
(см. Изображение)
Как это исправить?
Комментарии:
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
, вы обнаружите, что оно ведет себя точно так же.