代码之家  ›  专栏  ›  技术社区  ›  fortuneRice

Pandas自定义二级groupby函数

  •  1
  • fortuneRice  · 技术社区  · 3 年前

    我有这个:

    df = pd.DataFrame({'sku_id' : ['A','A','A','B','C','C'],
                      'order_counts' : [1,2,3,1,1,2],
                      'order_val' : [10,20,30,10,10,20]})
    

    这就产生了:

    output from first example

    简单的 groupby() 属于 sku_id 使用 df.groupby('sku_id').sum() 将给出:

    output from second example

    以及两级分组 df.groupby(['sku_id', 'order_counts']).sum() 将给出:

    output from third example

    但现在我想要一个自定义的二级分组 order_counts 以至于 order_counts == 1 被认为是一个群体和任何 order_counts > 1 在一个标记为 R (重复订购)

    结果如下:

    sku_id order_counts  order_val         
    A      1                    10
           R                    50                           
    B      1                    10
    C      1                    10
           R                    20
    

    有没有办法提供一个自定义的groupby函数来实现这一点?

    2 回复  |  直到 3 年前
        1
  •  2
  •   Shubham Sharma mkln    3 年前

    Mask 这个 != 1 价值观 order_counts R ,然后使用 groupby + sum

    g = df['order_counts'].mask(df['order_counts'] != 1, 'R')
    df.groupby(['sku_id', g])['order_val'].sum()
    

    后果

    sku_id  order_counts
    A       1               10
            R               50
    B       1               10
    C       1               10
            R               20
    Name: order_val, dtype: int64
    
        2
  •  1
  •   richardec    3 年前

    就这样怎么样 assign 在你之前 groupby ?

    new_df = (df
        .assign(order_counts=lambda x: np.where(x['order_counts'] > 1, 'R', x['order_counts']))
        .groupby(['sku_id', 'order_counts'])
        .sum()
    )
    

    输出:

    >>> new_df
                         order_val
    sku_id order_counts           
    A      1                    10
           R                    50
    B      1                    10
    C      1                    10
           R                    20