2017-03-15 76 views
0

我有一個熊貓數據框,名爲Visits2包含20M記錄。以下是來自Visits2的記錄樣本。通過數據幀迭代的優化方式

num   srv_edt  inpt_flag 
000423733A 8/15/2016 N 
001013135D 7/11/2016 N 
001013135D 7/11/2016 N 
001047851M 4/29/2016 N 
001067291M 2/29/2016 Y 
001067291M 8/3/2016 N 
001067291M 8/3/2016 N 
001067291M 9/4/2016 N 
001070817A 5/25/2016 N 
001070817A 5/25/2016 Y 
001072424A 1/13/2016 N 
001072424A 2/17/2016 Y 
001072424A 3/21/2016 N 
001072424A 3/21/2016 N 
001072424A 5/10/2016 N 
001072424A 6/6/2016 N 

我執行下面的代碼,與N,當srv_edt是組NUM的在第一次出現指定inpt_any。如果inpt_flag已經具有值Y,則將inpt_flag分配給Y

這是運行良好,但考慮在20M的數量,它需要數小時才能運行。 有人請建議我優化循環數據框的方式。

prev_srv_edt = " " 
for vv in Visits2.itertuples(): 
    inpt_any = 'N' 
    if (prev_srv_edt != vv[1]): 
     prev_srv_edt = vv[1] 
     Visits2.loc[vv[0],'inpt_any'] = 'N' 
    if (vv[2] == 'Y'): 
     Visits2.loc[vv[0],'inpt_any'] = 'Y' 

我曾嘗試與list(zip(visit['srv_edt'],visit['inpt_flag'])),但我看到zip同時服用大量的時間來運行。

+1

什麼是您的輸出應該看起來像 – piRSquared

回答

1

IIUC你能做到這樣:

In [37]: df.loc[df.groupby('num')['srv_edt'].idxmin(), 'inpt_any'] = 'N' 

In [38]: df 
Out[38]: 
      num srv_edt inpt_flag inpt_any 
0 000423733A 2016-08-15   N  N 
1 001013135D 2016-07-11   N  N 
2 001013135D 2016-07-11   N  NaN 
3 001047851M 2016-04-29   N  N 
4 001067291M 2016-02-29   Y  N 
5 001067291M 2016-08-03   N  NaN 
6 001067291M 2016-08-03   N  NaN 
7 001067291M 2016-09-04   N  NaN 
8 001070817A 2016-05-25   N  N 
9 001070817A 2016-05-25   Y  NaN 
10 001072424A 2016-01-13   N  N 
11 001072424A 2016-02-17   Y  NaN 
12 001072424A 2016-03-21   N  NaN 
13 001072424A 2016-03-21   N  NaN 
14 001072424A 2016-05-10   N  NaN 
15 001072424A 2016-06-06   N  NaN