基于文本匹配的Pandas数据帧连接与运行计算

2024-06-15 09:07:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个客户评论数据框架。你知道吗

我的第一个数据帧,'df'包含数千条原始客户评论、已处理/清理的评论数据和情绪得分:

reviewBody                   reviewClean           sentimentScore
'I like these goggles'       'like goggles'        1
'I don't like these goggles' 'don't like goggles'  -1
'My strap broke'             'strap broke'         -1
 ...                         ...                  ...

我的第二个数据帧,'bigrams'包含第一个数据帧中名为'reviewClean'的字段中最常见的bigrams:

topBigrams                 frequency
'like goggles'               150 
'strap broke'                100
  ...                        ...          

我的目标是把我的每一个topBigram,例如“like goggles”或“strap Break”,查找包含每个bigram和相关情绪的每个“reviewClean”,并计算每个topBigram的平均情绪得分。你知道吗

我的最终结果是这样的(数字仅用于说明):

topBigrams                 frequency   avgSentiment
'like goggles'             150         .98
'strap broke'              100         -.90
 ...                        ...         ...

从这些数据中,我将寻找每一个二元图的趋势,以更简洁的方式确定积极或消极情绪的驱动因素。你知道吗

我甚至不知道从哪里开始。非常感谢您对这一潜在方法的深入了解。你知道吗


Tags: 数据客户评论like情绪frequencydongoggles
1条回答
网友
1楼 · 发布于 2024-06-15 09:07:56

您将不得不执行交叉连接see this post,以便检查每个审阅是否包含每个bigram。使用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)

在每次清理的评论中检查了bigram之后,您可以使用groupby来计算for bigram上的平均情绪,只针对存在bigram的地方。然后将其合并回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

相关问题 更多 >