我有以下时间序列,测量两列中起点和终点之间的变化。我想计算列的 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
谢谢你,非常感谢你的帮助!我有以下的时间序列测量两个列的起点和终点之间的变化。
一个好的方法,这些 难以矢量化 问题是要配合 numba
. 通过使用 numba
代码被编译到 C-level
所以这在大数据量上应该会有很好的表现。通过在签名中加入numba类型,我们可以获得超前编译,进一步提升性能。这里我将输入类型设置为 float64
,为另一个输入 dtype
相应的改变。
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