如何使用Dask在for循环上正确迭代?

时间:2019-05-02 20:10:15

标签: pandas dask numba

当我使用dask和pandas运行这样的循环(见下文)时,仅评估列表中的最后一个字段。大概是因为“惰性评估”

import pandas as pd
import dask.dataframe as ddf

df_dask = ddf.from_pandas(df, npartitions=16)

for field in fields:
    df_dask["column__{field}".format(field=field)] = df_dask["column"].apply(lambda _: [__ for __ in _ if (__ == field)], meta=list)

如果我在最后一行添加“ .compute()”:

df_dask["column__{field}".format(field=field)] = df_dask["column"].apply(lambda _: [__ for __ in _ if (__ == field)], meta=list).compute()

然后它可以正常工作,但这是执行此操作的最有效方法吗? Dask是否可以一次添加字段列表中的所有项目,然后通过compute()一次性运行它们?

编辑---------------

请参见下面的屏幕截图以获取有效的示例

enter image description here

2 个答案:

答案 0 :(得分:1)

您将需要在计算结束时调用.compute()来触发工作。警告:.compute假定您的结果将适合内存

另外,请注意,lambdas在Python中后期绑定,因此field的值可能最终对于所有列都是相同的。

答案 1 :(得分:0)

这是一种实现方法,其中字符串检查只是返回True / False的示例函数。问题是lambda函数的绑定较晚。

from functools import partial

def string_check(string, search):
    return search in string

search_terms = ['foo', 'bar']
for s in search_terms:
    string_check_partial = partial(string_check, search=s)
    df[s] = df['YOUR_STRING_COL'].apply(string_check_partial)