个性化阅读
专注于IT技术分析

Python Pandas ffill if语句问题?

我有以下时间序列, 用于测量两列中起点和终点之间的变化。我想使用向量化的方法来计算第l列, 而不是在Pandas中记录从头到尾的路径的迭代。请问有简单的方法来计算列吗? ffill()和其他填充技术似乎并没有解决起始位置和结束位置之间的空白。有没有一种方法可以ffill/bfill以帮助解决此问题?

注意:s和e对应于开始和结束位置。我想建立一个序列, 其中l仅在s和e位置之间, 但不包括开始位置(并且不包括没有开始和结束的位置)。

在下面的示例中, 我们要在0-2行中用第一行以外的行填充l。还希望确保在我们有另一个s之前, 我们不会在行中添加一个。

    s   e   l
0   1.0 NaN NaN
1   NaN NaN 1.0
2   NaN 1.0 1.0
3   NaN NaN NaN
4   NaN NaN NaN
5   NaN NaN NaN
6   NaN NaN NaN
7   1.0 NaN NaN
8   1.0 1.0 1.0
9   1.0 1.0 1.0
10  1.0 1.0 1.0
11  NaN 1.0 1.0
12  NaN NaN NaN
13  NaN NaN NaN

谢谢, 非常感谢你的帮助!


#1


解决这些难以向量化的问题的一个好方法是使用numba。通过使用numba, 代码可以编译到C级, 因此在大型数据帧上应该可以很好地执行。通过具体化签名中的numba类型, 我们可以提前进行编译并进一步提高性能:

from numba import njit, float32

@njit('float32[:](float64[:, :])')
def ffill_conditional(a):
    flag_col0 = 0
    out = np.full(a.shape[0], fill_value=np.nan, dtype=float32)
    for i in range(a.shape[0]):
        if a[i, 0]==1. and flag_col0==0:
            flag_col0 = 1
            from_col0 = i+1
        elif a[i, 1]==1 and np.isnan(a[i+1, 1]) and flag_col0==1:
            till_col1 = i+1
            out[from_col0:till_col1] = 1.
            flag_col0=0
    return out

检查共享示例:

a = df.values[:, :2]
df['l'] = ffill_conditional(a)

print(df)

     s    e    l
0   1.0  NaN  NaN
1   NaN  NaN  1.0
2   NaN  1.0  1.0
3   NaN  NaN  NaN
4   NaN  NaN  NaN
5   NaN  NaN  NaN
6   NaN  NaN  NaN
7   1.0  NaN  NaN
8   1.0  1.0  1.0
9   1.0  1.0  1.0
10  1.0  1.0  1.0
11  NaN  1.0  1.0
12  NaN  NaN  NaN
13  NaN  NaN  NaN
赞(0)
未经允许不得转载:srcmini » Python Pandas ffill if语句问题?

评论 抢沙发

评论前必须登录!