我有一个包含以下列(“用户”、“产品代码”、“情绪”、“评论”)的数据框,其中“产品代码”包含产品代码,“情绪”包含值 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]
或者
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
关于python - 使用现有数据框的分组比率构建新的数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55839771/