当我使用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()一次性运行它们?
编辑---------------
请参见下面的屏幕截图以获取有效的示例
答案 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)