优化的迭代数据帧的方式

时间:2017-03-15 18:14:29

标签: python pandas optimization

我有一个pandas数据帧,名为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分配inpt_any,当srv_edt首次出现在num组中时。如果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 个答案:

答案 0 :(得分: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