Python Pandas用if语句填充?

问题描述 投票:1回答:1

我有以下时间序列,测量两列中起点和终点之间的变化。我想计算列的 l 使用向量化的方法,而不是在Pandas中迭代记录从起点到终点的路径。请问有没有一种简单的计算列的方法?ffill() 和其他填充技术天真地出现不解决起点和终点位置之间的空。有沒有辦法讓它的條件 ffill/bfill 来帮助解决这个问题?

se 对应于起始和结束位置。我想建立一个序列,其中 l 只在 se 位置,但不包括起始位置(也不包括没有起始和结束的位置)。

如下图所示的例子,我们要填入的第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

谢谢你,非常感谢你的帮助!我有以下的时间序列测量两个列的起点和终点之间的变化。

python pandas numpy numba
1个回答
5
投票

一个好的方法,这些 难以矢量化 问题是要配合 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
© www.soinside.com 2019 - 2024. All rights reserved.