按索引进行的 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')
我正在尝试按城市对我的 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')