2017-03-15 74 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