【问题标题】:How to groupby and aggregate on the same column如何在同一列上分组和聚合
【发布时间】:2018-11-05 14:40:07
【问题描述】:

我有一个销售数据框

Date    Store   Company     product             Amount
1-1-18  A       company_x       A001               10
1-1-18  A       company_y       A002               20
1-1-18  A       comapny_z       A003               30
1-1-18  B       comapny_x       A001               40
1-1-18  B       company_y       A002               50
1-1-18  B       company_z       A003               60
2-1-18  A       company_x       A001               10
2-1-18  A       company_y       A002               20
2-1-18  A       comapny_z       A003               30
2-1-18  B       comapny_x       A001               40
2-1-18  B       company_y       A002               50
2-1-18  B       company_z       A003               60
2-1-18  A       company_x       A001               10
2-1-18  A       company_y       A002               20
2-1-18  A       comapny_z       A003               30
2-1-18  B       comapny_x       A001               40
2-1-18  B       company_y       A002               50
2-1-18  B       company_z       A003               60
2-1-18  A       company_x       A001               10
2-1-18  A       company_y       A002               20
2-1-18  A       comapny_z       A003               30
2-1-18  B       comapny_x       A001               40
2-1-18  B       company_y       A002               50
2-1-18  B       company_z       A003               60
3-1-18  A       company_x       A001               10
3-1-18  A       company_y       A002               20
3-1-18  A       comapny_z       A003               30
3-1-18  B       comapny_x       A001               40
3-1-18  B       company_y       A002               50
3-1-18  B       company_z       A003               60

我想获取按产品、公司和商店分组的每个产品的销售订单的唯一计数

Store   Company     product          Count
A       Company_x       A001            5 
B       Company_y       A002            5
C       Company_z       A003            5

我试过了

df.groupby(['Store','Company','Product'],as_index='False').agg({'product':'nunique'})

但是python给我一个值错误,显然我不能使用同一列进行分组和聚合。

感谢您帮助我实现目标

编辑:

感谢您所有帮助我的答案,但这是我的错。实际上,我想找出这些产品已售出的唯一天数。

所以解决方案是,df.groupby(['Store','Company','Product'],as_index='False').agg({'Date':'nunique'})

【问题讨论】:

    标签: python pandas dataframe aggregate pandas-groupby


    【解决方案1】:

    与索引product 上的nunique 聚合将为每个组返回1,因为product 是索引中的最后一个级别。

    使用聚合函数'size' 并将系列重命名为count,如您的示例所示。然后reset_index 或groupby 选项as_index=False

    df.groupby(['Store', 'Company', 'product']).agg('size').rename('count').reset_index()
    
      Store    Company product  count
    0     A  comapny_z    A003      5
    1     A  company_x    A001      5
    2     A  company_y    A002      5
    3     B  comapny_x    A001      5
    4     B  company_y    A002      5
    5     B  company_z    A003      5
    

    【讨论】:

    • 感谢阿里的帮助。欣赏它
    【解决方案2】:

    似乎有两个问题:

    1. 你的系列名称是product,而不是Product
    2. 要获取项目数,您可以使用lennunique 给出了唯一值的数量。

    这是一个演示:

    res = df.groupby(['Store','Company','product'],as_index='False').agg({'product': len})
    
    print(res)
                             product
    Store Company   product         
    A     comapny_z A003           5
          company_x A001           5
          company_y A002           5
    B     comapny_x A001           5
          company_y A002           5
          company_z A003           5
    

    【讨论】:

    • 嗨@jpp,你刚刚运行代码吗,我运行了相同的代码,我得到这个错误ValueError:无法插入产品,已经存在。您提到的产品错误是错字
    • @AhamedMoosa,不幸的是,我无法复制您的错误。您可以尝试使用df.head().to_dict() 的输出来编辑您的问题,这样我们就有了一个完整的示例。
    • 嗨@jpp,感谢您指出,这是我的错误,我想知道它已售出的唯一天数。我已经编辑了我的问题
    【解决方案3】:

    count 上 groupby 将返回唯一行的所有计数,然后选择数量并重命名列将完成这项工作。

    data.groupby(['Store','Company','product'],as_index='False').count()['Amount'].rename('count').reset_index()
    
      Store    Company product  count
    0     A  comapny_z    A003      5
    1     A  company_x    A001      5
    2     A  company_y    A002      5
    3     B  comapny_x    A001      5
    4     B  company_y    A002      5
    5     B  company_z    A003      5
    

    【讨论】:

      猜你喜欢
      • 2015-09-08
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 2022-01-19
      • 2021-02-09
      • 1970-01-01
      • 2013-04-20
      • 2022-11-02
      相关资源
      最近更新 更多