在python中调用前一行的有效方法

时间:2015-08-20 23:00:17

标签: python optimization

每当在python中的数据帧列中找到0值时,我想替换前一行值。我使用了以下代码,

 if not a[j]:
     a[j] = a[j-1]

以及

if a[j]==0:
    a[j]=a[j-1]

更新

更新完整代码:

for i in pd.unique(r.a):
    sub=r[r.vehicle_id==i]
    sub=DataFrame(sub,columns=  ['a','b','c','d','e'])
    sub=sub.drop_duplicates(["a","b","c","d"])
    sub['c']=pd.to_datetime(sub['c'],unit='s')

    for j in range(1, len(sub[1:])):

        if not sub.d[j]:
            sub.d[j] = sub.d[j-1]
        if not sub.e[j]:
            sub.e[j]=sub.e[j-1]

    sub=sub.drop_duplicates(["lash_angle","lash_check_count"])

这是我的代码的开头。 sub.d [j]行只会延迟

使用整数值时,这两者似乎都运行良好。其中一列包含十进制值。使用该列的代码时,需要花费大量时间才能完成(大约15-20秒)语句。我循环了近10000个ID并且在此步骤浪费了15秒,这使得我的整个代码效率低下。有没有更好的方法,我可以为浮点(十进制)值执行此操作,以便它会更快?

由于

1 个答案:

答案 0 :(得分:0)

假设你通过“数据帧的列”表示你实际上是在谈论pandas DataFrame的一个列(系列),那么一个技巧就是用0替换0然后再用前向填充。例如:

>>> df = pd.DataFrame(np.random.randint(0,4, 10**6))
>>> df.head(10)
   0
0  0
1  3
2  3
3  0
4  1
5  2
6  3
7  2
8  0
9  3
>>> df[0] = df[0].replace(0, np.nan).ffill()
>>> df.head(10)
    0
0 NaN
1   3
2   3
3   3
4   1
5   2
6   3
7   2
8   2
9   3

您可以自己决定如何在开始时处理0的情况,您无需填写任何值。这假设您不希望单独留下NaN值,但如果有,则可以使用.loc的掩码仅选择要更改的掩码。