【问题标题】:Cumsum a column's values for last 12 months for each row pandasCumsum 过去 12 个月每行 pandas 的列值
【发布时间】:2021-05-11 21:36:39
【问题描述】:

我对每个 ID 都有一个这样的数据集;

Months ID AnnualSalaryChange
2020-12-01 1 0
2020-11-01 1 1
2020-10-01 1 0
2020-09-01 1 0
2020-08-01 1 0
2020-07-01 1 0
2020-06-01 1 0
2020-05-01 1 0
2020-04-01 1 0
2020-03-01 1 1
2020-02-01 1 0
2020-01-01 1 0
2019-12-01 1 1
2019-11-01 1 0
2019-10-01 1 0
2019-09-01 1 0
2019-08-01 1 0
2019-07-01 1 0
2019-06-01 1 0
2019-05-01 1 0
2019-04-01 1 0
2019-03-01 1 0
2019-02-01 1 1

我想要一个像 AnnualSalaryChangeSumFor12Months 这样的列。它应该是每行过去 12 个月(可变)的年薪变化值的累积总和。对于每一行,它应该回到 12 个月前,并将截至当时的值相加。如果没有 12 行要求和,则可以对剩余的行求和。

Months ID AnnualSalaryChange AnnualSalaryChangeSumFor12Months
2020-12-01 1 0 2
2020-11-01 1 1 3
2020-10-01 1 0 2
2020-09-01 1 0 2
2020-08-01 1 0 2
2020-07-01 1 0 2
2020-06-01 1 0 2
2020-05-01 1 0 2
2020-04-01 1 0 2
2020-03-01 1 1 2
2020-02-01 1 0 1
2020-01-01 1 0 2
2019-12-01 1 1 2
2019-11-01 1 0 1
2019-10-01 1 0 1
2019-09-01 1 0 1
2019-08-01 1 0 1
2019-07-01 1 0 1
2019-06-01 1 0 1
2019-05-01 1 0 1
2019-04-01 1 0 1
2019-03-01 1 0 1
2019-02-01 1 1 1

我试过了;

df['ChangeSum']=df.groupby(['ID','Year'])['AnnualSalaryChange'].cumsum()

但它并没有给出我真正想要的东西。我怎样才能做到这一点?谢谢。

【问题讨论】:

  • 为什么行 2020-02-01AnnualSalaryChangeSumFor12Months = 1
  • 您好,最后几行丢失了。我编辑了,现在就清楚了。

标签: python pandas dataframe


【解决方案1】:

假设这个df:

        Months  ID  AnnualSalaryChange
0   2020-12-01   1                   0
1   2020-11-01   1                   1
2   2020-10-01   1                   0
3   2020-09-01   1                   0
4   2020-08-01   1                   0
5   2020-07-01   1                   0
6   2020-06-01   1                   0
7   2020-05-01   1                   0
8   2020-04-01   1                   0
9   2020-03-01   1                   1
10  2020-02-01   1                   0
11  2020-01-01   1                   0
12  2019-12-01   1                   1
13  2019-11-01   1                   0
14  2019-10-01   1                   0
15  2019-09-01   1                   0
16  2019-08-01   1                   0
17  2019-07-01   1                   0
18  2019-06-01   1                   0
19  2019-05-01   1                   0
20  2019-04-01   1                   0
21  2019-03-01   1                   0
22  2019-02-01   1                   1
23  2020-12-01   2                   0
24  2020-11-01   2                   1
25  2020-10-01   2                   0
26  2020-09-01   2                   0
27  2020-08-01   2                   0
28  2020-07-01   2                   0
29  2020-06-01   2                   0
30  2020-05-01   2                   0
31  2020-04-01   2                   0
32  2020-03-01   2                   1
33  2020-02-01   2                   0
34  2020-01-01   2                   0
35  2019-12-01   2                   1
36  2019-11-01   2                   0
37  2019-10-01   2                   0
38  2019-09-01   2                   0
39  2019-08-01   2                   0
40  2019-07-01   2                   0
41  2019-06-01   2                   0
42  2019-05-01   2                   0
43  2019-04-01   2                   0
44  2019-03-01   2                   0
45  2019-02-01   2                   1

你可以这样做:

df["Months"] = pd.to_datetime(df["Months"])
df = df.sort_values(by="Months")

df_out = (
    df.groupby("ID")
    .rolling(on="Months", window=12, min_periods=1)["AnnualSalaryChange"]
    .sum()
    .reset_index()
    .sort_values(by=["ID", "Months"], ascending=[True, False])
).rename(columns={"AnnualSalaryChange": "AnnualSalaryChangeSumFor12Months"})
print(df_out)

打印:

    ID     Months  AnnualSalaryChangeSumFor12Months
22   1 2020-12-01                               2.0
21   1 2020-11-01                               3.0
20   1 2020-10-01                               2.0
19   1 2020-09-01                               2.0
18   1 2020-08-01                               2.0
17   1 2020-07-01                               2.0
16   1 2020-06-01                               2.0
15   1 2020-05-01                               2.0
14   1 2020-04-01                               2.0
13   1 2020-03-01                               2.0
12   1 2020-02-01                               1.0
11   1 2020-01-01                               2.0
10   1 2019-12-01                               2.0
9    1 2019-11-01                               1.0
8    1 2019-10-01                               1.0
7    1 2019-09-01                               1.0
6    1 2019-08-01                               1.0
5    1 2019-07-01                               1.0
4    1 2019-06-01                               1.0
3    1 2019-05-01                               1.0
2    1 2019-04-01                               1.0
1    1 2019-03-01                               1.0
0    1 2019-02-01                               1.0
45   2 2020-12-01                               2.0
44   2 2020-11-01                               3.0
43   2 2020-10-01                               2.0
42   2 2020-09-01                               2.0
41   2 2020-08-01                               2.0
40   2 2020-07-01                               2.0
39   2 2020-06-01                               2.0
38   2 2020-05-01                               2.0
37   2 2020-04-01                               2.0
36   2 2020-03-01                               2.0
35   2 2020-02-01                               1.0
34   2 2020-01-01                               2.0
33   2 2019-12-01                               2.0
32   2 2019-11-01                               1.0
31   2 2019-10-01                               1.0
30   2 2019-09-01                               1.0
29   2 2019-08-01                               1.0
28   2 2019-07-01                               1.0
27   2 2019-06-01                               1.0
26   2 2019-05-01                               1.0
25   2 2019-04-01                               1.0
24   2 2019-03-01                               1.0
23   2 2019-02-01                               1.0

【讨论】:

  • 谢谢!这正是我想要的。我很感激。
【解决方案2】:

试试这个:

df = df.sort_values(['Months'])
df['AnnualSalaryChangeSumFor12Months'] = df['AnnualSalaryChange'].rolling(window=12, min_periods=1).sum()
df = df.sort_values(['Months'], ascending=False)

与 groupby 非常相似,但更长一点:

df = df1.sort_values(['ID', 'Months'])
df['AnnualSalaryChangeSumFor12Months'] = df.reset_index(drop=True).groupby(['ID'])['AnnualSalaryChange'].rolling(window=12, min_periods=1).sum().reset_index(level=0, drop=True)
df = df.sort_values(['ID', 'Months'], ascending=False)

【讨论】:

  • 嗨,谢谢它的工作,但是当我添加 groupby('ID') 时,我收到了这个错误:TypeError: incompatible index of inserted column with frame index。如何添加 groupby?
  • 为什么要添加groupby?结果不是已经是你想要的了吗?
  • ID 有很多,我应该可以为每个 ID 执行此操作。
  • 非常感谢!我很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-08
  • 2010-10-11
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
相关资源
最近更新 更多