python - 分组后如何平均减值?
问题描述
我有一个表,其中一些值属于索引,而另一些属于重复值。例如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 中类别数量的成本。所以它看起来像
是否可以应用这种滚动功能?
解决方案
这是您可以做的事情:
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)
推荐阅读
- qt - 如何处理qt3d中的点击事件?
- wordpress - 是否可以将多站点主站点产品显示到子站点中?
- python - 试图将多个精灵调用到屏幕上会导致故障?
- javascript - 从其样式对象访问元素
- node.js - MongoDb Node.js 驱动程序 - 我是否必须为每个操作关闭和打开连接?
- tensorflow - Tensorflow-gpu,没有属性“python_io”
- python - 通用 n 门蒙蒂霍尔问题模拟器
- python - 使用 python 将文件移动到特定目录获取错误文件已存在
- java - 复制到 vaadin 14 中的剪贴板组件
- javascript - 从选定的单选按钮显示输入文本框