2014-11-05 62 views
0

我想弄清楚什麼時候特定的用戶第一次達到設定的目標。作爲簡化版本我有2個數據集(捐款1和1募捐)Python熊貓更好的方式來找到數量大於目標的日期

import pandas as pd 
import numpy as np  
Donations = pd.DataFrame({ 
      "id": pd.Series([1,2,3,4,5,6,7,8,9,10]), 
      "amount": pd.Series([10, 15, 10, 15, 10, 20, 70, 20,20,30]), 
      "solicitor": pd.Series([1, 1, 2, 2, 3, 4, 5, 1,1,2]), 
      "day": ([1,2,1,2,2,3,2,4,5,5]), 
      }) 
Fundraisers = pd.DataFrame({ 
      "id": pd.Series([1,2,3,4,5]), 
      }) 

所以假設我們的目標是30,我想找到的第一天至少$ 30提出每個募捐活動。 我使用GROUPBY和循環

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循環遍歷每個捐款來完成這一點。所以想知道是否有更好的方法去做這件事?

回答

1

首先我猜想Fundraisers的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 

什麼呢?

+0

乾杯。唯一需要改變的是在cumulative_amount代碼之前添加Donations = Donations.sort(「day」)。 – Wizuriel 2014-11-05 21:37:22

+0

按建議編輯 – Daniele 2014-11-05 23:55:38