我有下面的数据框,上面有葡萄酒的种类,评价者和评分。我想制作一个新的DataFrame,将变量输出为列标签,并按审阅者和变量列出平均得分。简而言之,我想在顶部输出一个数据框,而将审阅者作为具有审阅者和多样性的平均得分的索引。我已经尝试了好几种方法,但无法正常工作。
实际信息中,我将拥有更多的评论者,种类更多,但我想提供一个简化的版本。
任何帮助将不胜感激。预先谢谢你。
import pandas as pd
df = pd.DataFrame({"Variety": ['Cabernet', 'Pinot', 'Cabernet', 'Pinot', 'Pinot', 'Cabernet', 'Pinot', 'Cabernet'],
"Reviewer": ['Bill', 'Sally', 'Bill', 'Sally', 'Bill', 'Sally', 'Bill', 'Sally'],
"Score": [90, 85, 87, 93, 80, 81, 93, 88]})
答案 0 :(得分:3)
更像一个pivot
问题
pd.pivot_table(df,index='Reviewer',columns='Variety',values='Score',aggfunc='mean')
Out[29]:
Variety Cabernet Pinot
Reviewer
Bill 87.000000 87.666667
Sally 84.666667 93.000000
答案 1 :(得分:0)
您可以分组,计算均值并调整结果:
df.groupby(['Variety', 'Reviewer']).mean() \
.reset_index() \
.pivot(index='Reviewer', columns='Variety')
Score
Variety Cabernet Pinot
Reviewer
Bill 88.5 86.5
Sally 84.5 89.0
第一行计算均值,最后一行适当调整数据框的形状。第二行对于使.mean()
函数的形状正确地生成pivot()
输出是必需的。
分步:
df.groupby(['Variety', 'Reviewer']).mean()
Score
Variety Reviewer
Cabernet Bill 88.5
Sally 84.5
Pinot Bill 86.5
Sally 89.0
df.groupby(['Variety', 'Reviewer']).mean().reset_index()
Variety Reviewer Score
0 Cabernet Bill 88.5
1 Cabernet Sally 84.5
2 Pinot Bill 86.5
3 Pinot Sally 89.0
我们现在可以使用pd.pivot()
将其从“长格式”转换为“宽格式”,并将结果显示在这篇文章的顶部。
答案 2 :(得分:0)
您可以尝试:
>>> df.groupby(['Reviewer', 'Variety']).mean()
Score
Reviewer Variety
Bill Cabernet 88.5
Pinot 86.5
Sally Cabernet 84.5
Pinot 89.0