【问题标题】:how to divide the sum of a groupby value with the count the another value如何将 groupby 值的总和与另一个值的计数相除
【发布时间】:2018-09-05 22:42:28
【问题描述】:

我想按“标签”和“月”分组以汇总每个月和每个标签的销售数量。

我正在尝试使用“groupby and apply”方法来实现这一点,但不确定如何计算每个标签的月份。比如说,对于标签值 AFFLELOU (DOS),我有两个第 7 个月的值。所以,我应该将售出的数量相加并除以 2。 第 9 个月和第 10 个月,我只有一个值,所以计数为 1,它将除以销售数量。

我写了下面的代码,但是它没有把 count 作为一个函数并且返回 count not defined 错误。

t1.groupby(['label', 'month']).apply(lambda x: x['Quantity sold'] 
.sum()/count('month'))

谁能告诉我如何获取每个标签每个月的计数值?

提前致谢。

【问题讨论】:

    标签: python pandas count pandas-groupby


    【解决方案1】:

    您可以使用agg('mean'),而不是求和、计数和除法:

    t1.groupby(['label', 'month'])['Quantity sold'].agg('mean') 
    

    或者,如果您确实希望保留总和和计数,请使用:

    t1.groupby(['label', 'month'])['Quantity sold'].agg(['sum', 'count', 'mean']) 
    

    例如,

    import numpy as np
    import pandas as pd
    
    t1 = pd.DataFrame(np.random.randint(4, size=(20,3)), columns=['label', 'Quantity sold', 'month'])
    t1.groupby(['label', 'month'])['Quantity sold'].agg(['sum', 'count', 'mean']) 
    

    产生类似的 DataFrame

                 sum  count  mean
    label month                  
    0     1        2      1  2.00
          2        0      1  0.00
          3        2      2  1.00
    1     1        1      2  0.50
          2        3      1  3.00
          3        1      1  1.00
    2     0        0      1  0.00
          1        0      3  0.00
          3        5      4  1.25
    3     0        1      1  1.00
          1        0      1  0.00
          2        0      1  0.00
          3        3      1  3.00
    

    在这里使用groupby/agg 及其内置聚合器sumcountmean 显然更方便,但如果您确实需要将groupby/apply 与自定义函数一起使用,您可以使用:

    t1.groupby(['label', 'month']).apply(lambda x: x['Quantity sold'].sum()/len(x))
    

    请注意,虽然使用 groupby/apply 调用自定义函数为您提供了更大的灵活性,但这是有代价的,因为为每个组调用一次自定义 Python 函数通常比调用 groupby/agg 中提供的内置 Cythonized 聚合器要慢。


    如果您在 Quantity sold 中缺少 (NaN) 值,了解 group/agg 具有 'count''size' 聚合器可能会有所帮助:

    • 'count' 返回非NaN 值的数量
    • 'size' 返回组的长度(包括 NaN 值)

    count 始终小于或等于sizemeansum(非NaN 值)除以count。要查看countsize 之间的区别,您可以尝试以下代码:

    np.random.seed(2018)
    t1 = pd.DataFrame(np.random.randint(4, size=(50,3)), columns=['label', 'Quantity sold', 'month'])
    t1.loc[np.random.choice([True, False], len(t1)), 'Quantity sold'] = np.nan
    t1.groupby(['label', 'month'])['Quantity sold'].agg(['sum', 'count', 'size', 'mean']) 
    

    产生

                 sum  count  size      mean
    label month                            
    0     1      0.0      0     3       NaN
          2      6.0      2     2  3.000000
          3      0.0      0     1       NaN
    1     0      3.0      2     5  1.500000
          1      0.0      0     1       NaN
          2      5.0      3     5  1.666667
          3      0.0      2     3  0.000000
    2     0      7.0      3     5  2.333333
          1      4.0      4     8  1.000000
          2      5.0      2     3  2.500000
          3      5.0      2     3  2.500000
    3     0      1.0      2     5  0.500000
          1      3.0      1     1  3.000000
          2      2.0      1     2  2.000000
          3      2.0      1     3  2.000000
    

    【讨论】:

    • 谢谢@unutbu。在添加缺失的日期后对数据进行分组时,我尝试了同样的方法,但这并没有给我预期的结果。由于没有添加到数据集中的缺失日期,平均值返回我期望的结果。感谢您清理并提供解决方案:)
    • 再次感谢@unutbu 的详细解释。我需要添加缺少的月份,然后添加 0。到目前为止,我已经通过删除 NaN 值来清理我的数据。当我缺少值时,您的解决方案和解释将来会很有用。再次感谢 :) 非常感谢。
    • @Unutbu 你能看看我的问题Inline Link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2016-05-30
    相关资源
    最近更新 更多