Pandas 数据透视表值计数
Posted
技术标签:
【中文标题】Pandas 数据透视表值计数【英文标题】:Pandas pivot table value counts 【发布时间】:2020-05-02 09:10:09 【问题描述】:我有一个格式为:
Name Score Bin
John 90 80-100
Marc 30 20-40
John 10 0-20
David 20 0-20
...
我想创建一个如下所示的数据透视表:
Name 0-20 20-40 40-60 60-80 80-100 Total count Avg score
John 1 2 nan nan 2 5 60.53
Marc nan 2 nan nan nan 2 32.13
David 3 2 nan nan nan 5 21.80
所以我想要有显示每个桶的值计数的列,以及值的总计数和平均分数。
我试过了
table = pd.pivot_table(df, values=['Score', "Bin"], index=["nAME"],
aggfunc="Score" : np.average, "Bin" : "count",
dropna=True, margins = True)
但是我只是得到总体计数,而不是按桶细分
【问题讨论】:
df.groupby('Name')['Bin'].value_counts().unstack('Bin')
【参考方案1】:
分三步完成你的任务:
生成一个数据透视表:
df2 = pd.pivot_table(df, index='Name', columns='Bin', values='Score', aggfunc='count')\
.reindex(columns=['0-20', '20-40', '40-60', '60-80', '80-100'])\
.rename_axis(columns='')
结果,为您的源数据扩展以大致给出您的预期 结果,是:
0-20 20-40 40-60 60-80 80-100
Name
David 3.0 2.0 NaN NaN NaN
John 1.0 2.0 NaN NaN 2.0
Marc NaN 2.0 NaN NaN NaN
注意:由于 NaN 是 float 的特例,其他值也是 浮动类型。
生成 Total_count 和 Avg_score:
df3 = df.groupby('Name')\
.agg(Total_count=('Score', 'count'), Avg_score=('Score', 'mean'))\
.rename(columns='Total_count': 'Total count', 'Avg_score': 'Avg score')
结果是:
Total count Avg score
Name
David 5 21.8
John 5 61.0
Marc 2 32.0
加入以上两个表格:
result = df2.join(df3)
结果是:
0-20 20-40 40-60 60-80 80-100 Total count Avg score
Name
David 3.0 2.0 NaN NaN NaN 5 21.8
John 1.0 2.0 NaN NaN 2.0 5 61.0
Marc NaN 2.0 NaN NaN NaN 2 32.0
【讨论】:
以上是关于Pandas 数据透视表值计数的主要内容,如果未能解决你的问题,请参考以下文章