【问题标题】:Pandas Groupby How to Show Zero Counts in DataFramePandas Groupby 如何在 DataFrame 中显示零计数
【发布时间】:2017-11-18 23:29:05
【问题描述】:

我有以下 Pandas 数据框:

Name   | EventSignupNo | Attended | Points
Smith  | 0145          | Y        | 20.24
Smith  | 0174          | Y        | 29.14
Smith  | 0239          | N        | 0
Adams  | 0145          | N        | 0
Adams  | 0174          | Y        | 33.43
Morgan | 0239          | Y        | 31.23
Morgan | 0244          | Y        | 23.15

我想要计算每人参加和未参加的活动数量,以及每人的积分总和。所以我做了一个groupby:df.groupby([Name, Attended]).agg({"Attended": "count", "Points": "sum"}).rename(columns = {"Attended: "Count"}).reset_index()

这会给我类似的东西:

Name   | Attended | Count | Points
Smith  | Y        | 2     | 49.38
Smith  | N        | 1     | 0
Adams  | Y        | 1     | 33.43
Adams  | N        | 1     | 0
Morgan | Y        | 2     | 54.38

但我想要类似的东西:

Name   | Attended | Count | Points
Smith  | Y        | 2     | 49.38
Smith  | N        | 1     | 0
Adams  | Y        | 1     | 33.43
Adams  | N        | 1     | 0
Morgan | Y        | 2     | 54.38
Morgan | N        | 0     | 0

我尝试使用 pd.MultiIndex 来填补缺失的零计数, 但无济于事。我已经阅读了其他类似的问题,但我无法使用 MultiIndex 处理连续点列。知道怎么做吗?

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    您可以使用 groupby + agg 做到这一点。对于每个级别的YN 的精确输出,您需要reindex

    g = df.groupby(['Name', 'Attended'], sort=False).Points.agg(['count', 'sum'])
    
    g
                     count    sum
    Name   Attended              
    Smith  Y             2  49.38
           N             1   0.00
    Adams  N             1   0.00
           Y             1  33.43
    Morgan Y             2  54.38
    
    idx = pd.MultiIndex.from_product([g.index.levels[0], ['Y', 'N']])
    
    idx
    MultiIndex(levels=[['Adams', 'Morgan', 'Smith'], ['N', 'Y']],
               labels=[[2, 2, 0, 0, 1, 1], [1, 0, 1, 0, 1, 0]])
    
    
    g.reindex(idx, fill_value=0)
    
              count    sum
    Smith  Y      2  49.38
           N      1   0.00
    Adams  Y      1  33.43
           N      1   0.00
    Morgan Y      2  54.38
           N      0   0.00
    

    【讨论】:

    • @COLDSPEED 后续问题:以上工作,我注意到您将聚合更改为 " ... .Points.agg()" 。对我来说,习惯上它读作点聚合。既然它对分数求和,是否可以说它通过发生与组 ['Name', 'Attended'] 的关系来“计算”分数?计数部分对我来说似乎很奇怪。
    • @L.Chu 你的理解是正确的。它计算每个组的大小。
    猜你喜欢
    • 2014-08-03
    • 2017-01-11
    • 2019-03-16
    • 2021-07-17
    • 1970-01-01
    • 2021-05-24
    • 2013-07-14
    • 2019-01-03
    相关资源
    最近更新 更多