dask dataframe是否应用保留行顺序?

时间:2019-04-03 13:03:38

标签: pandas parallel-processing lazy-evaluation dask

我正在考虑使用具有当前状态的闭包来计算滚动窗口(在我的情况下为宽度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是用于测试的伪函数。因此,函数可以通过actual_fcn = test(0);进行初始化,例如,我们假设初始值为零。最后,可以通过ddf.apply使用功能(其中ddf是实际的dask数据帧)。

最后一个问题:如果保留计算顺序,这将起作用,否则所有内容将被打乱。我尚未对其进行测试,因为-即使它通过了-我也不能100%确信它将始终保留该订单。因此,问题是:

dask数据框的apply方法是否保留行顺序?

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

1 个答案:

答案 0 :(得分: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()

表现符合预期。有一个很大的警告:如果以前的状态是通过引用提供的(即:它是某个类的某个对象),则用户应谨慎使用嵌套函数内部的相等性来更新以前的状态:因为它将产生副作用,如果状态通过引用传递。

严格地说,此示例不能证明在任何情况下都可以保留订单;所以我仍然会对我是否可以依靠这个假设感兴趣。