基于项目的总和

2024-04-20 02:48:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图建立一个时间段,比如说30天,在这个例子中,每个ID和Project的数量在这个时间段内被添加。你知道吗

基本上,30天总和的开始时间必须是在开始日期第一次看到ID和项目时。如果在30天内再次看到相同的ID和项目,则应将其与前一个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和2017年4月28日的300。你知道吗

我也尝试过按项目“排序”,但没有成功。再次感谢您的帮助,谢谢!你知道吗


Tags: 数据项目projectid数量错误时间解决方案
1条回答
网友
1楼 · 发布于 2024-04-20 02:48:59

你基本上看到的是一个孤岛和缺口问题。对于具有相同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

相关问题 更多 >