首页 > 解决方案 > 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 个代码确实给了我需要的值,但是如何将这些值作为列存储在同一个数据框中?

任何帮助深表感谢!

标签: python-3.xpandas

解决方案


您可以使用转换来获取您想要的列,如下所示

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

推荐阅读