dask数据帧是否应用保留行顺序?

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

我正在考虑使用一个具有当前状态的闭包来计算滚动窗口(在我的情况下是宽度为2),以回答我自己最近提出的question。有点像:

def test(init_value):

    def my_fcn(x,y):

        nonlocal init_value
        actual_value = (x + y) * init_value

        init_value = actual_value
        return init_value

    return my_fcn

其中my_fcn是用于测试的虚函数。因此,例如,我们假设初始值为零时,函数可能会被初始化为tsugh actual_fcn = test(0);。最后,可以通过ddf.apply使用该函数(其中ddf是实际的dask数据帧)。

最后一个问题:如果保留计算的顺序,这将起作用,否则一切都会被扰乱。我没有测试它,因为 - 即使它通过 - 我不能100%确定它将始终保持订单。所以,问题是:

dask dataframe的apply方法是否保留了行顺序?

还有其他想法吗?任何帮助高度赞赏。

pandas parallel-processing lazy-evaluation dask
1个回答
0
投票

显然是的。我正在使用dask 1.0.0。

以下代码:

import numpy as np
import pandas as pd
import dask.dataframe as dd
number_of_components = 30

df = pd.DataFrame(np.random.randint(0,number_of_components,size=(number_of_components, 4)), columns=list('ABCD'))
my_data_frame = dd.from_pandas(df, npartitions = 1 )


def sumPrevious( previousState ) :

    def getValue(row):
        nonlocal previousState 
        something = row['A'] - previousState 
        previousState = row['A']
        return something
    return getValue

given_func = sumPrevious(1)
out = my_data_frame.apply(given_func, axis = 1 , meta = float).compute()

表现如预期。有一个很大的警告:如果前一个状态是通过引用提供的(即:它是某个类的某个对象),那么用户应该小心在嵌套函数中使用相等来更新以前的状态:因为它会产生副作用,如果通过引用传递状态。

严格地说,这个例子并不能证明在任何情况下都保留了秩序;所以我仍然有兴趣能否依靠这个假设。

© www.soinside.com 2019 - 2024. All rights reserved.