Вам нужно будет сделать перекрестное соединение см. Этот пост , чтобы проверить, содержит ли каждый отзыв каждый биграмм.Использование apply
не обходится, так как вам нужно сравнивать строки по строкам.
df = pd.DataFrame([['I like these goggles', 'like goggles', 1],
["I don't like these goggles", "don't like goggles", -1],
['My strap broke', 'strap broke', -1]],
columns=['reviewBody', 'reviewClean', 'sentimentScore'])
bigrams = pd.DataFrame([['like goggles', 150],
['strap broke', 100]],
columns=['topBigrams', 'frequency'])
dfx = bigrams.assign(key=1).merge(df.assign(key=1), on='key').drop('key', 1)
dfx['has_bigram'] = dfx.apply(lambda x: x.get('topBigrams') in x.get('reviewClean'), axis=1)
После проверки биграммы в каждом очищенном обзоре вы можете использовать groupby для вычисления среднего настроенияна биграмме, только там, где биграмм существует.Затем объедините его с фреймом данных bigrams
.
bigrams.merge(dfx.groupby(['topBigrams', 'has_bigram'])
.mean()
.reset_index()
.query('has_bigram')
.rename(columns={'sentimentScore':'avgSentiment'})
.get(['topBigrams', 'avgSentiment']),
on='topBigrams')
# returns:
topBigrams frequency avgSentiment
0 like goggles 150 0
1 strap broke 100 -1