2015-06-09 55 views
3

我正在處理一些數據,我必須獲取發生日期。例如,假設我們正在處理醫療數據。每行是來自病人的獨特訪問,儘管同一位病人可以有多行。每行還包含訪問類型的信息,無論是常規還是急診室。熊貓獲取以前的數據幀按日期排列

我需要通過,併爲每一行,獲取病人之前入住急診室的日期。例如,我想下面添加一列previous_er_discharge_date:

visit_id patient_id discharge_date visit_type previous_er_discharge_date 
1   abc   2014-05-05  in-patient 2014-05-01 
2   abc   2014-05-01  emergency  NaT 
3   def   2014-04-18  in-patient NaT 
4   def   2014-03-12  in-patient 2014-02-12 
5   def   2014-02-12  emergency  NaT 

所以我有一些工作,但它是非常緩慢的。我基本上只是創建一個只有ER訪問的單獨數據框,並遍歷主數據框,並查找該患者是否存在以前的ER日期,如果他們這樣做,我會先拿出第一個ER日期。 (數據按discharge_date排序)。我有的代碼的一般表示。

er_visits = main_data[main_data.visit_type=='emergency'] 
prev_dates = [] 
for index, row in main_data.iterrows(): 
    dates = er_visits.discharge_date[(er_visits.patient_id==row.patient_id) & 
            (er_visits.discharge_date < row.discharge_date)].values 

    if len(dates) > 0: 
     prev_dates.append(dates[0]) 
    else: 
     prev_dates.append(pd.NaT) 

上面的代碼工作,但它很慢,我希望能找到更快的方法來做到這一點的幫助。我正在處理的數據集有數十萬行,這是每天必須運行的。

謝謝!

回答

12

在熊貓中,你基本上想要避免循環,因爲它們會導致性能下降。

她是一個類似於你的數據框(我懶惰的約會,所以他們是整數;這是同樣的想法)。

df = pd.DataFrame({ 
    'id': ['abc', 'abc', 'def', 'def', 'def'], 
    'date': [505, 501, 418, 312, 212]}) 

這裏是一個函數,對於每個組,附加上一個日期:

def prev_dates(g): 
    g.sort(columns=['date']) 
    g['prev'] = g.date.shift(-1) 
    return g 

所以這是需要的所有是連接東西:

>> df.groupby(df.id).apply(prev_dates) 
    date id prev 
0 505  abc  501 
1 501  abc  NaN 
2 418  def  312 
3 312  def  212 
4 212  def  NaN 

編輯

正如@julius所述,sort(columns=已被棄用,應該由``sort_values(by ='')替換。

+2

g.sort現在不推薦使用「g.sort_values(by = ['date'])」 – Julius

+1

@Julius謝謝!更新。 –

+0

沒有Probem,你的解決方案救了我的屁股:-) – Julius

0

如果您需要查找該患者的所有訪問該怎麼辦?

sort[Date, ID] 
[nextpatient] = [ID].shift(-1) 
[nextvisit] = np.where([ID] == [nextpatient], 1, 0) 
[nextdate] = np.where([nextvisit] == 1, [Date].shift(-1), datetime64.nat) 

這是我的方法(鍵入我的手機,所以它不是確切的)。我排序,然後轉移一個獨特的我。如果該ID與ID相匹配,那麼我會更新日期。然後我創建一個列來衡量互動之間的時間。另一列確定訪問的原因是什麼,也只是另一個轉變。

我想知道在速度方面這是否也是一個好方法。我每週在500萬行數據集上運行它。