gpt4 book ai didi

python - 基于项目的 SUM

转载 作者:太空宇宙 更新时间:2023-11-04 04:04:20 24 4
gpt4 key购买 nike

我正在尝试建立一个时间段,假设在这种情况下为 30 天,在该时间段内每个 ID 和 Project 添加 Amount。

基本上,30 天总和的开始时间必须是在开始日期之前首次看到 ID 和项目的时间。然后,如果在 30 天内再次看到相同的 ID 和项目,则应将其添加到前一个。 30 天后,如果出现相同的 ID 和项目,另一个 SUM() 应该开始,另一个 30 天 SUM()。

经过大量的 QA 和帮助,我遇到了一个我无法解决的错误 - 我非常感谢任何人的时间和解决方案的帮助。

输入数据框是:

ID  Project Amount  Start Date
2345 251 3 3/20/17
3456 251 50 4/10/17
1234 203 75 4/12/17
1234 203 100 4/13/17
2345 251 4 4/16/17
3456 251 125 4/28/17
3456 251 300 4/28/17
3456 251 50 3/22/18
3456 251 100 3/23/18
1234 203 1 5/29/18
1234 203 2 5/29/18
1234 203 29.65 5/29/18
3456 251 43.75 6/5/18

预期输出:

ID  Project Period  Amount
1234 203 0 175
1234 203 9 32.65
2345 251 0 7
3456 251 0 475
3456 251 7 150
3456 251 9 43.75

实际输出:

ID  Project Period  Amount
1234 203 0 175
1234 203 9 32.65
2345 251 0 7
3456 251 0 50
3456 251 5 425
3456 251 7 150
3456 251 9 43.75

如您所见,425 和 50 由于某种原因没有加在一起。实际应该显示 475,从 2017 年 4 月 10 日的 50,到 2017 年 4 月 28 日的 125,到 17 年 4 月 28 日的 300。

我确实也尝试过按 Project 对“sort_values”进行排序,但这没有用。再次感谢您的帮助,谢谢!

最佳答案

您基本上是在研究孤岛和缺口问题。对于具有相同 IDProject 的行,一个“孤岛”跨越 30 天。 Start Date 在此期间内的任何行都归入同一个岛。否则,他们将开始一个新的“岛屿”。

def summarize(x):
date = x['Start Date'].iloc[0]
islands = [date]
gap = pd.Timedelta(days=30)

for d in x['Start Date'].iloc[1:]:
date = d if (d - date) > gap else date
islands.append(date)

return x.groupby(islands).agg({
'Amount': 'sum'
})

df.sort_values('Start Date').groupby(['ID', 'Project']).apply(summarize)

输出:

                         Amount
ID Project
1234 201 2018-07-16 100.00
203 2017-04-13 200.00
2018-05-29 81.65
2018-07-01 645.34
2345 203 2018-08-13 95.12
2019-04-12 10.00
251 2017-04-11 7.00
3456 251 2018-03-23 150.00
2018-06-05 43.75

关于python - 基于项目的 SUM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57631992/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com