首页 > 解决方案 > 分组后如何平均减值?

问题描述

我有一个表,其中一些值属于索引,而另一些属于重复值。例如sid索引,成本属于 sid,但一个 sid 可以包含许多事务,甚至多个事务可以包含多个类别。

df = pd.DataFrame([
    [1, 100, 1, 'A', 1, 50, 2],
    [1, 100, 2, 'A', 1, 50, 1],
    [1, 100, 2, 'B', 2, 100, 1],
    [1, 100, 2, 'C', 3, 50, 1],
    [2, 200, 3, 'D', 4, 500, 1],
    [2, 200, 4, 'C', 2, 100, 1],
    [3, 200, 5, 'B', 2, 100, 1],
    [3, 200, 5, 'A', 1, 50, 1],
    [3, 200, 5, 'A', 3, 50, 1]
], columns=['sid', 'costs', 'transaction_id', 'category', 'sku', 'price', 'quantity'])

df['revenue'] = df['price'] * df['quantity']

因此,如果查看 sid 级别,我需要获取成本的第一个值和收入的总和。这就是它应该的样子。总成本 - 500,总收入 - 1100。

df.groupby('sid').agg({'costs': 'min', 'revenue':'sum'}).pivot_table(index='sid', margins=True, aggfunc='sum')  

在此处输入图像描述

但我想按类别分解 sid 。我可以这样做。

df.groupby(['sid', 'category']).agg({'costs': 'min', 'revenue':'sum'}).pivot_table(index=['sid', 'category'], aggfunc='sum', margins=True)

在此处输入图像描述

我的问题是每一行的成本都是重复的。成本总和为 1100,这是不正确的。我想同样降低每个 sid 中​​类别数量的成本。所以它看起来像

在此处输入图像描述

是否可以应用这种滚动功能?

标签: pythonpandaspivot-tablepandas-groupby

解决方案


这是您可以做的事情:

g = df.groupby(['sid', 'category']).agg({'revenue':'sum', 'costs': 'min'})
div = df.groupby(['sid'])['category'].nunique()
g['costs'] = g['costs']/div

                revenue     costs
sid category                     
1   A             150   33.333333
    B             100   33.333333
    C              50   33.333333
2   C             100  100.000000
    D             500  100.000000
3   A             100  100.000000
    B             100  100.000000

对于最后一行,包括sum两列中的最后一行,只需在最后再次添加:

g.pivot_table(index=['sid', 'category'], aggfunc='sum', margins=True)

推荐阅读