按索引进行的 Dask Repartition 未按预期工作,导致 2 个而不是 3 个分区

Dask Repartition by Index Not working as Expected, Resulting in 2 Instead of 3 Partitions

我正在尝试按城市对我的 dask 数据框进行重新分区。我目前有超过 100 万行,但只有 3 个城市。所以很自然地,我希望根据我包含的参数有 3 个分区数据帧。

我直接从 Dask 文档站点使用的代码:

ddf_1 = ddf.set_index("City")
ddf_2 = ddf_1.repartition(divisions=list(ddf_1.index.unique().compute()))

我在下面创建了一个虚拟 DF 来帮助解释我想要的结果。下面我有一个基于城市的不平衡数据集。我想根据唯一城市的数量对 DF 进行分区。

理想结果:

但是,在运行上面的代码之后。我只得到两个分区,其中两个分区中的每一个都包含 2 个唯一索引(即城市)。我不明白为什么在明确指示 dask 应该如何对 DF 进行分区之后,它会导致 2 个而不是 3 个分区。一种想法是可能由于 DF 不平衡,它忽略了 'divisions' 参数。

set_index 的文档字符串中所述,len(divisons) 等于 npartitions + 1。这是因为divisions代表了每个分区的上下界。因此,如果你想让你的 Dask DataFrame 有 3 个分区,你需要将长度为 4 的列表传递给 divisions。此外,当您在 Dask DataFrame 上调用 set_index 时,它会根据传递的参数重新分区,因此无需在之后立即调用 repartition。我建议这样做:

import dask.dataframe as dd
import pandas as pd

df = pd.DataFrame({
    'City': ['Miami'] * 4 + ['Chicago'] * 2 + ['Detroit'],
    'House_ID': [1, 2, 3, 4, 3, 4, 2],
    'House_Price': [100000, 500000, 400000, 300000, 250000, 135000, 269000]
})
ddf = dd.from_pandas(df, npartitions=2).set_index(
    'City', divisions=['Chicago', 'Detroit', 'Miami', 'Miami'])

或者,您可以让 Dask 根据内存使用情况选择最佳分区,方法是将上述代码段的最后一行更改为 ddf = dd.from_pandas(df, npartitions=2).set_index('City', npartitions='auto')