#python #pandas #function #for-loop
#python #pandas #функция #for-цикл
Вопрос:
У меня есть два фрейма данных pandas, один из которых содержит один столбец всех обзоров фильмов с открытым текстом (movie_review_df), а другой (movie_ngrams_df), который содержит наиболее распространенные ngrams (top 5 из ngram = 1 и top 5 из ngram = 2), найденные в movie_review_df.
По сути, я хотел бы написать функцию, которая будет перебирать каждую строку моего столбца слов / словосочетаний в моем movie_ngrams_df и использовать их в качестве поисковых запросов для поиска обзоров, содержащих эти слова / рабочие фразы.
Представьте, что мой movie_ngrams_df имеет 2 значения в 2 столбцах.
1) Слово «любовь» в столбце a (ngram_wordphrase) и «один» в столбце b (ngram_group)
2) Фраза «слишком длинная» в столбце a и «два» в столбце b
Я думаю, что функция, которая использует цикл и .contains()
вызов, будет работать, но, похоже, я не могу понять это.
Я бы хотел, чтобы это работало примерно так.
def ngram_lookup (ngram,reviews):
appended_df = pd.concat(for word in ngram:
reviews_df[reviews_df['reviews'].str.contains('ngram')])
return appended_df
Мне нужна функция, которая будет искать текст каждого обзора фильма в movie_review_df и извлекать обзоры, содержащие слово «любовь». Я хочу, чтобы результатом был новый df (ngram_detail_df), где каждая представленная строка содержит word_phrase (например, love в столбце a), а затем полный обзор отдельной строки (помещенный в столбец b), который содержит в нем слово ‘love’. Таким образом, каждая фраза word_phrase, вероятно, будет указана несколько раз в столбце a.
ТОГДА (вы знали, что это произойдет) Я хочу иметь возможность сделать то же самое для следующей word_phrase в нашем movie_ngrams_df, которая была «слишком длинной». Я хочу добавить эти новые «слишком длинные» результаты к результатам, возвращенным из нашего поиска «love», чтобы в конце у нас был только один df, содержащий верхние word_phrases и каждый обзор фильма, где присутствует это слово / word_phrase.
Ответ №1:
Как насчет чего-то вроде
words = movie_ngrams_df["ngram_wordphrase"].array
ngram_detail_df = movie_review_df.copy()
for word in words:
ngram_detail_df[word] = ngram_detail_df["reviews"].apply(lambda x: word in x)
ngram_detail_df = ngram_detail_df.melt(id_vars=["reviews"])
ngram_detail_df = ngram_detail_df[ngram_detail_df["value"] == True]
ngram_detail_df = ngram_detail_df.loc[:, ["reviews", "variable"]
ngram_detail_df.rename(columns={"variable": "ngram"}, inplace=True)