我的应用程序需要将数据集读入dask,并分布在多个分区中。对于该数据框,我需要对其进行多项操作(例如,从另一列中减去一列或找到两列的比率)。数据框的索引是一个非唯一列。
由于应用程序完全由元数据驱动,因此直到运行时才知道函数调用的顺序,因此我将应用程序设计为依靠在每个阶段返回新的延迟数据帧。我想知道是否可以巧妙地使用分区和按列级联来提高代码效率。
鉴于这些步骤是相互独立的,在下面的特定示例中,我可以相信最后的操作可以为我的按行比率给出正确的结果吗?即,如果我执行的操作仅向数据帧添加新列,我是否可以相信行的顺序永远不会改变?
def subtract(df1, df2, col1, col2):
df_mod = copy(df1)
df_mod[f"{col1}-{col2}"] = df1[col1] - df2[col2]
return df_mod
def ratio(df1, df2, col1, col2):
df_mod = copy(df1)
# Rely on the row ordering being unchanged
df_mod[f"{col1}/{col2}"] = df1[col1] / df2[col2]
return df_mod
df = load_function_returns_dask_df()
first = subtract(df, df, "a","b")
second = subtract(df, df, "c","d")
last = ratio(first, second, "a-b","c-d")
我知道我可以直接在数据框上操作以创建新列,但这在任意操作的一般情况下不起作用。
从直觉上来说,该操作应该有效,因为每个分区只是一个熊猫数据框,对于熊猫来说,任意地对数据框中的行进行重新排序是没有意义的,但是我希望通过某种方式来验证这一点更加正式。
答案 0 :(得分:0)
正确的,Dask不会对分区行进行重新排序,只要您执行的熊猫操作本身通常不会对行进行重新排序(显然是sort
之类),这对于任何逐行计算都是正确的
实际上,分区本身的顺序在数据经过一次又一次的操作时得以保留。