Pandas自定义二级groupby函数

Pandas custom second level groupby function

我有这个:

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]})

创建:

使用 df.groupby('sku_id').sum()sku_id 的简单 groupby() 会得到:

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

但现在我想要在 order_counts 上进行自定义二级分组,这样任何 order_counts == 1 都被视为一个组,而任何 order_counts > 1 都被分组到一个标记为 [=20 的组中=](重复订单)

结果如下所示:

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

有没有办法提供自定义 groupby 函数来实现此目的?

Mask order_counts 列中的 != 1 值与 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

在你 groupby 之前 assign 怎么样?

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