【问题标题】:Group BY based on one column and get unique and sum of other columns pandas基于一列分组并获得其他列的唯一性和总和熊猫
【发布时间】:2021-10-05 11:07:37
【问题描述】:

我有这样的数据框:

id   product   department   price
1      x           a          5
2      y           b         10
1      z           b         15
3      z           a         2
2      x           a         1
1      x           a         1
4      w           b         10

现在我想使用id 进行分组,并在与之关联的列表中获取product and department 的所有唯一值以及价格总和。

预期输出:

id   product   department   price
1    [x, z]      [a, b]      21
2    [x, y]      [a, b]      11
3    [z]         [a]         2
4    [w]         [b]         10

现在我可以进行 groupby 并从 3 中获取一列,但我无法弄清楚如何获取所有三列。

df.groupby(['id'])[product].unique()

【问题讨论】:

    标签: python pandas group-by


    【解决方案1】:

    要获得productdepartment的唯一值的排序列表(如您的预期结果所示),您可以将np.unique()GroupBy.agg()一起使用,如下所示:

    import numpy as np
    
    df.groupby('id', as_index=False).agg(
        {'product': lambda x: np.unique(x).tolist(), 
         'department': lambda x: np.unique(x).tolist(), 
         'price': 'sum'})
    

    结果:

       id product department  price
    0   1  [x, z]     [a, b]     21
    1   2  [x, y]     [a, b]     11
    2   3     [z]        [a]      2
    3   4     [w]        [b]     10
    

    【讨论】:

      【解决方案2】:

      id 上的 Groupby,在列上应用所需的聚合。对于唯一值,如果不需要保留订单,一种方法是list(set(<sequence>))。如果需要下单,可以用x.unique().tolist()代替list(set(x))

      out = (df.groupby('id')
            .agg({'product': lambda x: list(set(x)),
                  'department': lambda x: list(set(x)),
                  'price': sum
                  })
             )
      

      输出:

         product department  price
      id                          
      1   [z, x]     [a, b]     21
      2   [x, y]     [a, b]     11
      3      [z]        [a]      2
      4      [w]        [b]     10
      

      【讨论】:

        【解决方案3】:

        使用带有dict定义的agg()的简单案例

        import io
        
        df = pd.read_csv(io.StringIO("""id   product   department   price
        1      x           a          5
        2      y           b         10
        1      z           b         15
        3      z           a         2
        2      x           a         1
        1      x           a         1
        4      w           b         10"""), sep="\s+")
        
        df.groupby("id").agg({"price":"sum","product":lambda s: s.unique().tolist(), "department":lambda s: s.unique().tolist()})
        
        
        id price product department
        1 21 ['x', 'z'] ['a', 'b']
        2 11 ['y', 'x'] ['b', 'a']
        3 2 ['z'] ['a']
        4 10 ['w'] ['b']

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-08-13
          • 2016-02-20
          • 1970-01-01
          • 2016-12-16
          • 2019-04-02
          • 2017-11-27
          • 2023-03-15
          • 2017-03-03
          相关资源
          最近更新 更多