黄昏版本1.1.4
dask.dataframe.head()的行为与熊猫不同,这让我措手不及。
经过过滤的dask.dataframe似乎将行保留在原始分区中。如果将分区的所有行过滤掉,则分区将保留为空,但仍保留在结果dask.dataframe中。如果len(第一个分区) 两个输出不相同。 head(n)返回少于n行的UserWarning确实建议增加npartitions,这解决了问题: 但是我宁愿不必每次使用dask时都牢记这一点。此外,即使大多数分区为空,如果将npartitions始终设置为-1,似乎性能也会受到很大影响。 我的问题是,这种特殊设计背后的原因是什么?是否可以通过简单地遍历分区直到收集到n行或分区耗尽来匹配熊猫的行为?Me.Controls("MyTextbox").ControlSource = "valX"
import dask
import dask.dataframe as dd
dd = dask.datasets.timeseries()
# Original partitions lengths
print(dd.map_partitions(len).compute())
# Since len(first partition) > 5, head() works fine
print(dd.head())
# Now we filter data
dd_filter = dd[dd['id'] <= 870]
# Observe the empty partitions and those with len < 5
print(dd_filter.map_partitions(len).compute())
# Note the difference between the following two outputs:
print(dd_filter.head())
print(dd_filter.compute().head())
答案 0 :(得分:1)
我的问题是,这种特殊设计背后的原因是什么?是否可以通过简单地遍历分区直到收集到n行或分区耗尽来匹配熊猫的行为?
在某些情况下,是的,您的建议将非常可行,但并非全部。例如,考虑数据框是排序操作的结果的情况。我们可以计算出第一个分区,意识到这还不够,但是很遗憾,在这一点上,我们已经丢掉了所有先前的数据。
我们应该重新计算完整排序的数据集吗?那很贵
我们是否应该计算一些分区以防万一?这可能适合也可能不适合内存。
最终,我们唯一能做的就是警告并告诉用户发生了什么事,以便他们可以自己做出明智的决定。