Python 这是一种更好的方法来确定金额大于目标的日期

Python 这是一种更好的方法来确定金额大于目标的日期,python,pandas,Python,Pandas,我试图找出特定用户何时首次达到设定的目标。作为一个简化版本,我有两个数据集(一个是捐赠数据集,一个是募捐数据集) 因此,假设目标是30美元,我想发现每个筹款者第一天至少筹集了30美元。 我通过使用groupby和for循环实现了这一点 def test(group, amount): group = group.sort("day") myamount = 0 date = np.NaN for i in group.index: myamount

我试图找出特定用户何时首次达到设定的目标。作为一个简化版本,我有两个数据集(一个是捐赠数据集,一个是募捐数据集)

因此,假设目标是30美元,我想发现每个筹款者第一天至少筹集了30美元。 我通过使用groupby和for循环实现了这一点

def test(group, amount):
    group = group.sort("day")
    myamount = 0
    date = np.NaN
    for i in group.index:
        myamount = myamount + group.loc[i, "amount"]
        if (myamount >= amount):
            date = group.loc[i, "day"]
            break
    return date
Fundraisers =  Fundraisers.set_index(['id'])
Fundraisers["first day"] = Donations.groupby(["solicitor"]).apply(lambda x: test(x, 30))
Fundraisers = Fundraisers.reset_index()  

我只是觉得有一个更好的方法来做这件事,而不是使用for循环来完成每次捐赠。所以想知道是否有更好的方法来实现这一点?

首先,我假设筹款人的id是唯一的,因此我建议您使用id作为索引。在你的例子中,我会做如下事情:

Fundraisers = pd.DataFrame(index= pd.Series([1,2,3,4,5]))
那么我建议您使用如下代码:

Donations.sort("day",inplace=True)
cumulative_amount = Donations.groupby('solicitor').amount.cumsum()
Fundraisers['first day'] = Donations[cumulative_amount>=30].groupby('solicitor').min().day

怎么样?

干杯。唯一需要更改的是在累计金额代码之前添加捐款=捐款.sort(“天”)。
Donations.sort("day",inplace=True)
cumulative_amount = Donations.groupby('solicitor').amount.cumsum()
Fundraisers['first day'] = Donations[cumulative_amount>=30].groupby('solicitor').min().day