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

时间:2019-04-24 23:15:16

标签: python python-3.x dataframe group-by calculation

我有一个包含以下列(“用户”,“ ProdCode”,“情感”,“审阅”)的数据框,其中“ ProdCode”包含产品代码,“情感”包含0、1、2 ,“评论”包含一个字符串文本评论。请参见下面的示例:

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]

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

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

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

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

看起来像这样:

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

我尝试在数据框(以下代码)中创建许多新字段而未成功。

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

OR

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

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

1 个答案:

答案 0 :(得分:1)

通过合并两个单独的数据框组结果来制作新的数据框。第一个将按“ ProdCode”和“情绪”分组,第二个将按“ 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