使用现有数据框的分组比率构建新数据框

Build New Dataframe with Grouped Ratios from Existing Dataframe

我有一个包含以下列("User"、"ProdCode"、"Sentiment"、"Review")的数据框,其中 "ProdCode" 包含产品代码,并且"Sentiment" 包含值 0、1、2,"Review" 包含字符串文本评论。请参见下面的示例:

User    ProdCode  Sentiment  Review
User1   X1        0          [string]
User2   X1        0          [string]
User3   X1        2          [string]
User4   X2        1          [string]
User5   X2        2          [string]
User6   X2        1          [string]
User7   X3        2          [string]
User8   X3        2          [string]

我正在尝试创建一个 DataFrame 来对 "ProdCode" 进行分组并显示 3 个比率:

1) 情绪 = 0 的行数 / 产品代码的评论总数

2) 情绪 = 1 的行数 / 产品代码的评论总数

3) 情绪 = 2 的行数/产品代码的评论总数

看起来像这样:

ProdCode  SentimentRatio0  SentimentRatio1  SentimentRatio2
X1        .67              0                .33                
X2        0                .33              .67
X3        0                0                1.00 

我已经尝试了很多不成功的 Dataframe 新字段创建,代码如下。

DFF['sent0_ratio'] = [(count(DFF[sentiment])) if x == "0" else "0" for x in DFF.sentiment]

DFF['sent0_ratio'] = sum(DFF['sentiment' if x == 0 for x in DFF.sentiment].groupby(DFF['ProdCode']).mean(), 2)

这些都没有按预期工作。我什至不认为我很接近。

通过连接两个单独的数据框组结果来创建一个新的数据框。第一个将按 "ProdCode" 和 "Sentiment" 分组,第二个将按 "ProdCode" 分组以获得每个 "ProdCode" 的总计数。加入 "ProdCode" 并将列限制为 "Review" 和 Review_r"

df1 = (
    df.groupby(["ProdCode", "Sentiment"])
    .count()
    .join(df.groupby("ProdCode").count(), "ProdCode", rsuffix="_r")
)[['Review', 'Review_r']]

df1

                    Review  Review_r
ProdCode Sentiment                  
X1       0               2         3
         2               1         3
X2       1               2         3
         2               1         3
X3       2               2         2

计算 "Review"/"Review_r",将索引重置为列,然后对最终结果进行透视。

df1['result'] = df1['Review']/df1['Review_r']
df1 = df1.reset_index()
df1 = df1.pivot("ProdCode", 'Sentiment','result').fillna(0)

最终数据帧:

Sentiment         0         1         2
ProdCode                               
X1         0.666667  0.000000  0.333333
X2         0.000000  0.666667  0.333333
X3         0.000000  0.000000  1.000000