是否可以 Pandas 向量化涉及切片数据范围条件的操作?

Is it possible to Pandas vectorize for operation involving a condition of a range of slice data?

在此操作中,array 被分割成 range。 这样,给定数组

arr = np.array([.1, .11, .21, .01, .5, .7, .91, .92, .95, .96, .1, .21, .23, .6, .7, .71, .72, .95, 0.96, 0.97])

和一系列值,

步骤 1

drange = np.arange(start_, end_)

切片如下

第 2 步

select_val = arr[drange]

然后 select_val 检查大于阈值的值,th

步骤 3

bool_data = select_val<th

最后,使用 argmin 到 return 沿轴的最小值索引。

第 4 步

doutput = np.argmin(bool_data)

在我的例子中,变量 start_end_ 存储在 Pandas 数据帧中:

df = pd.DataFrame(dict(s=[1, 10], e=[12, 19]))

然而,arr 是 Numpy 类型。

目前,我将 Pandas' apply 用于压缩所有步骤 1-4 的函数:

def fx(arr, st, en, th):

    return np.argmin(arr[np.arange(st, en)] < th)

但是,是否可以改用 向量化 方法?

当前策略代码如下:

def fx(arr, st, en, th):

    return np.argmin(arr[np.arange(st, en)] < th)

 th = 0.9
 np.random.seed(0)

 arr = np.array([.1, .11, .21, .01, .5, .7, .91, .92, .95,  # 8 select 6 range: 1-12
                  .96, .1, .21, .23, .6, .7, .71, .72, .95, 0.96, 0.97])     # Select 15 range 10-17


 df = pd.DataFrame(dict(s=[1, 10], e=[12, 19]))

 df['opt'] = df.apply(lambda x: fx(arr, x['s'], x['e'], th), axis=1)

NumPy 广播

m1 = arr[:, None] > th
ix = np.arange(len(arr))[:, None]
m2 = (ix >= list(df.s)) & (ix < list(df.e))

df['opt'] = np.argmax(m1 & m2, axis=0) - df.s

结果

    s   e  opt
0   1  12    5
1  10  19    7

另一种选择,虽然不是矢量化,

df['opt'] = df.apply(
    lambda x: np.argmin(arr[x['s']:x['e']] <th), axis=1)

但是,潜在的问题是很难处理这种形式的异常错误。