【问题标题】:Does dask dataframe apply preserve rows order?dask 数据框是否应用保留行顺序?
【发布时间】:2019-08-25 00:38:48
【问题描述】:

我正在考虑使用当前状态的闭包来计算滚动窗口(在我的情况下宽度为 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 方法是否保留行顺序?

还有其他想法吗?任何帮助都非常感谢。

【问题讨论】:

    标签: pandas parallel-processing lazy-evaluation dask


    【解决方案1】:

    显然是的。我正在使用 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()
    

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

    严格地说,这个例子并不能证明在任何情况下都能保持秩序;所以我仍然会对我是否可以依赖这个假设感兴趣。

    【讨论】:

      猜你喜欢
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 2019-11-02
      • 1970-01-01
      • 2018-11-24
      • 2010-10-14
      • 1970-01-01
      相关资源
      最近更新 更多