pandas 如何将下面的算法矢量化?

ajsxfq5m  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(111)

对于下面的算法,有没有一种方法可以代替for循环进行矢量化?

def test_func(df):

    idx_lst = [df.index[0]]
    end = df.loc[df.index[0], "end"]

    for idx in df.index[1:]:
        if df.loc[idx, "begin"] > end:

            end = df.loc[idx, "end"]
            idx_lst.append(idx)
    
    return df.loc[idx_lst]

测试用例:
Dataframe ({“开始”:[3、5、7、8、10、12、14],“结束”:[8、9、10、12、13、14、17]})

begin end
0   3   8
1   5   9
2   7   10
3   8   12
4   10  13
5   12  14
6   14  17

测试函数(df)

begin end
0   3   8
4   10  13
6   14  17
3xiyfsfu

3xiyfsfu1#

我同意前面的评论,即很难甚至不可能使用矢量化。
但请尝试以下函数:

def myFunc(df):
    arr = df.begin.values > df.end[:, np.newaxis]
    r = 0
    idx_lst = [r]
    while True:
        wrk = np.nonzero(arr[r])[0]
        if wrk.size == 0:
            return df.iloc[idx_lst]
        r = wrk[0]
        idx_lst.append(r)

我的解决方案的优点是“比较数组”(arr -是否某行的 * 开始 * column〉另一行的 end column)是一次性计算的。
另一个优点是不需要处理每一行。
还有一个优点是我使用了 Numpy,众所周知,它的运行速度比 Pandas 快。
在您的源数据样本上使用 %timeit,我声明我的函数生成结果所用的时间与您的函数相同。
但是在更大的源数据样本上试试,也许我的解决方案会更快。

相关问题