python-3.x - python中的SQL sum() over() 等价物
问题描述
我有一个提供总销售额、月份和年份的数据框。我想添加 2 个新行,按月和年汇总销售额。以下是我拥有的数据的快照:
df
Sales Month Year
1 89825870 1 2017
2 248494100 1 2017
3 216344700 2 2017
4 209009300 3 2017
5 204138200 3 2017
6 12456789 1 2018
7 109876543 1 2018
上述数据显示了不同年份不同月份记录的销售额。
以下是我希望获得的数据示例:
df
Sales Month Year Tot Sales/Month Tot Sales/Year
1 89825870 1 2017 338319970 967812170
2 248494100 1 2017 338319970 967812170
3 216344700 2 2017 216344700 967812170
4 209009300 3 2017 413147500 967812170
5 204138200 3 2017 413147500 967812170
6 12456789 1 2018 122333332 122333332
7 109876543 1 2018 122333332 122333332
如您所见,新列Tot Sales/Month
按月和年记录销售额总和(月 1 和 2017 年,将记录销售额总和,并且对于月为 1 和年为 2017 的所有行等)和列Tot Sales/Year
做同样的事情,但只是多年。
我知道这段代码很容易在 SQL 中使用窗口函数获得,但我对如何在 pandas 上执行此操作感到困惑。
我尝试过的如下所示:
df.groupby('Month','Year')['Sales'].sum()
df.groupby('Year')['Sales'].sum()
上面的 2 个代码确实给了我需要的值,但是如何将这些值作为列存储在同一个数据框中?
任何帮助深表感谢!
解决方案
您可以使用转换来获取您想要的列,如下所示
import pandas as pd
import numpy as np
df = pd.DataFrame([('89825870', '1', '2017'), ('248494100', '1', '2017'), ('216344700', '2', '2017'), ('209009300', '3', '2017'), ('204138200', '3', '2017'), ('12456789', '1', '2018'), ('109876543', '1', '2018')], columns=('Sales', 'Month', 'Year'))
df["Sales"] = df["Sales"].astype(np.int)
df["sales/month"] = df.groupby(["Month", "Year"]).transform("sum")
df["sales/year"] = df.groupby("Year")["Sales"].transform("sum")
df
推荐阅读
- reactjs - 在 React Native 中将函数传递给功能组件
- javascript - 使用来自服务器的数据自动提供 html 页面?
- bash - 用于检查 openshift/kubernetes pod 是否准备就绪的 Bash 脚本
- c# - 为什么我在 C# 中拒绝 COM 端口访问
- android - 在android中将ARGB颜色字符串转换为int ARGB int格式颜色
- javascript - Sequelize 在显式定义外键时要求多个关联值
- javascript - 使用 BeautifulSoup 4 和 Requests_HTML 抓取 Javascript 网站
- c++ - 为什么当我尝试从基类打印属性时,它总是 0 ?在 C++ 中
- awk - 如何使用 awk 输出数据集的选定元素
- javascript - 意外的 event.target.nodeName = FONT