【问题标题】:Join and run calculations on Pandas DataFrame based on text matching基于文本匹配在 Pandas DataFrame 上加入并运行计算
【发布时间】:2018-12-24 01:51:35
【问题描述】:

我有两个客户评论数据的数据框。

我的第一个数据框 '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”的字段中最常见的二元组:

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

我的目标是获取我的每个 topBigram,例如'like goggles' 或 'strap broken',查找包含每个 bigram 的每个 'reviewClean' 以及与整个评论相关联的情绪,并计算每个 topBigram 的平均情绪得分。

我的最终结果将如下所示(纯数字用于说明):

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

然后,我会从这些数据中寻找每个二元组的趋势,以更简洁的方式确定积极或消极情绪的驱动因素。

我什至不知道从哪里开始。非常感谢您对此处潜在方法的任何见解。

【问题讨论】:

  • 您是否从df 派生了bigrams 数据框?如果是这样,你可以做df.groupby('reviewClean').mean()
  • 如果你想要频率和平均情绪,你可以做df.groupby('reviewClean').agg(['mean', 'count']).sort_values(('sentimentScore', 'count'), ascending=False)

标签: python pandas sentiment-analysis


【解决方案1】:

您将不得不进行交叉连接see this post 以检查每条评论是否包含每一个二元组。使用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

【讨论】:

  • 了不起的詹姆斯!非常感谢您在这里的见解。在解构逻辑之后,我学到了很多关于如何解决问题并可以应用于未来相关问题的知识。
猜你喜欢
  • 1970-01-01
  • 2022-07-14
  • 2013-01-15
  • 2019-08-29
  • 2022-01-24
  • 1970-01-01
  • 2019-06-16
  • 2020-01-20
  • 2021-04-02
相关资源
最近更新 更多