2017-03-01 33 views
1

我有一個這樣的數據集:一組的第一行開始迭代熊貓

Policy | Customer | Employee | CoveragDate | LapseDate 
123 | 1234  | 1234  | 2011-06-01 | 2015-12-31 
124 | 1234  | 1234  | 2016-01-01 | ? 
125 | 1234  | 1234  | 2011-06-01 | 2012-01-01 
124 | 5678  | 5555  | 2014-01-01 | ? 

我試圖通過每個政策對每一個客戶的每一個員工迭代(一個客戶可以有很多員工,員工可以有多個政策),並將所涵蓋的日期與特定員工的失效日期進行比較。如果所涵蓋的日期和失效日期在5天內,我想將該政策添加到結果列表中。

因此,預計產量將是:

Policy | Customer | Employee 
123 | 1234  | 1234 

因爲政策123的失效日期是內政策124的覆蓋之日起5天。

我在嘗試迭代客戶/員工號碼的每個分組時遇到問題。我可以確定每個EmployeeID/Customer編號(EBCN below)組中有多少行數據,但我需要引用這些行中的特定數據來分配變量以供比較。

到目前爲止,我已經能夠寫這樣的代碼:

import pandas 
import datetime 

wd = pandas.read_csv(DATASOURCE) 
l = 0 
for row, i in wd.groupby(['EMPID', 'EBCN']).size().iteritems(): 
    Covdt = pandas.to_datetime(wd.loc[l, 'CoverageEffDate']) 
    for each in range(i): 
     LapseDt = wd.loc[l, 'LapseDate'] 
     if LapseDt != '?': 
      LapseDt = pandas.to_datetime(LapseDt) + datetime.timedelta(days=5) 
      if Covdt < LapseDt: 
       print('got one!') 
     l = l + 1 

這個代碼不工作,因爲我想與LOC函數引用在對特定行覆蓋的日期/時隔日期,我的行號存儲在'l'變量中。我最初認爲Pandas會按照它們出現在我的數據集中的順序迭代,這樣我就可以簡單地從l = 0開始(即數據中的第一行),根據這些數據分配覆蓋日期和失效日期變量,然後繼續前進,但看起來Pandas開始隨機地遍歷組。因此,我確實比較了失效/覆蓋日期,但它們與最終通過代碼獲取輸出的組沒有關聯。

我能想出的最佳解決方案是確定每個組的第一行的行號,然後通過該組的行數向前迭代。

我已經通過關於調查組的第一排一個問題閱讀,我能夠通過使用

wd.groupby(['EMPID','EBCN']).first() 

這樣做,但我一直沒能找出什麼行號的結果以我可以用loc函數引用的方式存儲。有沒有辦法將組的第一行的行號存儲在變量或其他東西中,這樣我可以從那裏迭代我的覆蓋日期和失效日期比較?

http://stackoverflow.com/questions/23870745/pandas-computation-in-each-group 

但是,我需要每個策略組中比較反對對方的政策:

關於我的一般方法,我經過這裏的問題,這是非常接近我所需要的閱讀該組 - 上面的問題只是比較每組中的最後一行與其他組。

有沒有辦法做我在熊貓/ Python嘗試的?我一直在研究/編寫這個腳本大約3天,並且一直沒能找到解決方案,但我對編程也很新穎。

謝謝!

+0

我會添加5天到失效日,然後通過將5天的timedelta傳遞給容差參數來玩pd.merge_asof – Boud

+0

是的!我嘗試merge_asof與時間三角洲,它返回我想要的!非常感謝!!! – funkadellicdan

+0

您可以提交自己的解決方案,請做到這一點,以便更大的社區可以從您的問題和經驗中受益。 – Boud

回答

0

對於任何未來需要這些信息的人 - 我能夠實現Boud的建議,使用pandas.merge_asof()函數替換上面的代碼。我必須做一些數據處理才能得到想要的結果:

  1. 將數據幀分成兩個獨立的幀 - 一個使用CoverageDate,一個使用LapseDate。
  2. 替換'?' (空值)在我的數據與numpy.nan數據類型
  3. 通過日期列

一旦數據是正確的格式排序的左,右dataframes,我實現了合併:

pandas.merge_asof(cov, term, 
    on='Date', 
    by='EMP|EBCN', 
    tolerance=pandas.Timedelta('5 days')) 

注'cov'是我的數據幀,包含覆蓋日期,term是帶有失效的數據幀。 'EMP | EBCN'列是員工ID和客戶#字段的連接列,以便於使用'by'字段。

非常感謝Boud讓我走下正確的道路!