为什么Dask在我的数据框中填充“ foo”和1

时间:2019-02-08 11:39:16

标签: dataframe dask dask-distributed

我已经阅读了大约15个csv文件:

df = dd.read_csv("gs://project/*.csv", blocksize=25e6,
                 storage_options={'token': fs.session.credentials})

然后我保留了数据框(它使用7.33 GB内存):

df = df.persist()

我设置了一个新索引,因为我希望在该字段上的分组依据尽可能高效:

df = df.set_index('column_a').persist()

现在我有181个分区和180个分区。 为了测试group by进行的速度,我尝试了一个自定义套用功能,该功能仅打印Group Dataframe:

grouped_by_index = df.groupby('column_a').apply(lambda n: print(n)).compute()

这打印了一个带有正确列的数据框,但是值是“ 1”,“ foo”或“ True”。示例:

column_b  column_c column_d  column_e  column_f  column_g  \
index                                                                   
a          foo           1      foo        1           1           1

我也收到警告:

  

/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:1:   UserWarning:未指定meta,这是从部分数据推断得出的。   如果结果出乎意料,请提供meta。之前:   .apply(func)之后:.apply(func,meta = {'x':'f8','y':'f8'})   数据框结果或:.apply(func,meta =('x','f8'))
  用于系列结果“”启动IPython内核的入口点。

这是怎么回事?

1 个答案:

答案 0 :(得分:1)

实际上,如果您阅读了apply的文档,您将看到meta=是可以传递的参数,它告诉Dask如何期望该操作的输出看起来如何。这是必要的,因为apply可以做非常普通的事情。

如果您提供meta=(例如您的情况),那么Dask将尝试使用示例迷你数据帧为该操作植入种子,该示例迷你数据帧的任何数字列均包含1,“ foo ”作为文本,仅查看输出结果。由于您在apply中进行了打印(并且实际上没有返回任何内容),因此您会看到此种子。

如文档所建议,最好总是提供meta=,这样就可以避免整个过程。