【问题标题】:Subsetting Dask DataFrames子集 Dask DataFrame
【发布时间】:2018-03-30 22:05:45
【问题描述】:

这是将 dask 数据帧的子集加载到内存的有效方法吗:

while i < len_df:
    j = i + batch_size 
    if j > len_df: 
        j = len_df
    subset = df.loc[i:j,'source_country_codes'].compute()

我在某处读到这可能不正确,因为 dask 如何分配索引号,因为它将较大的数据帧划分为较小的 pandas dfs。此外,我认为 dask 数据帧没有 iloc 属性。 我使用的是 0.15.2 版

就用例而言,这将是一种将批量数据加载到深度学习(比如 keras)的方式。

【问题讨论】:

    标签: python dask


    【解决方案1】:

    如果您的数据集有众所周知的分区,那么这可能会起作用,但我建议一次只计算一个分区。

    for part in df.to_delayed():
        subset = part.compute()
    

    你可以通过预先重新分区来大致控制大小

    for part in df.repartition(npartitions=100).to_delayed():
        subset = part.compute()
    

    这并不完全相同,因为它不能保证每个分区中的行数是固定的,但这种保证可能会非常昂贵,具体取决于数据的获取方式。

    【讨论】:

    • 但是后一种方法可以保证我会遍历整个数据集,对吧?我还应该提到我之前做过这个:df = dd.from_pandas(df, 16)。它会引起冲突还是只是做另一个分区?
    • 是的,这将包括整个数据集。您可以安全地重新分区。或者您可以使用不同数量的分区调用 from_pandas。无论哪种方式,一切都应该在这里正常工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多