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
    

    注意:由于 NaNfloat 的特例,其他值也是 浮动类型。

    生成 Total_countAvg_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 数据透视表值计数的主要内容,如果未能解决你的问题,请参考以下文章

Python pandas 怎么实现透视计数而不是求和

Pandas 数据透视表和分组按月和小时

在使用数据透视表值编辑数据时选择

具有多索引的 Pandas 子数据透视表和总数据透视表

怎样设置PostgreSQL中字段和表名对大小写敏感

Pandas:排序数据透视表