我有一個這樣的數據集:一組的第一行開始迭代熊貓
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天,並且一直沒能找到解決方案,但我對編程也很新穎。
謝謝!
我會添加5天到失效日,然後通過將5天的timedelta傳遞給容差參數來玩pd.merge_asof – Boud
是的!我嘗試merge_asof與時間三角洲,它返回我想要的!非常感謝!!! – funkadellicdan
您可以提交自己的解決方案,請做到這一點,以便更大的社區可以從您的問題和經驗中受益。 – Boud