使用Dask Delayed后无法生成正确DataFrame的问题求助
解决方案
问题原因
你遇到的额外括号嵌套是因为:
map()返回的是迭代器,当你把这个迭代器传给dd.compute()时,Dask 会将其视为单个参数,因此返回结果会被包装在一个元组中(元组的第一个元素就是你需要的字典列表)。- 另外,你的
combine函数返回的字典中包含延迟对象,但直接计算后需要将结果转换为 DataFrame。
修正方案一:调整计算步骤并转换为 DataFrame
直接修改现有代码,处理计算后的元组并生成 DataFrame:
from dask import delayed, compute import pandas as pd def combine(val): a = delayed(rss)(val) b = delayed(altman)(val) df = {'Tiker': val, 'RS': a, 'Alt': b} return df vals = tickers # 将 map 迭代器转换为列表(包含带延迟对象的字典) delayed_dicts = list(map(combine, vals)) # 计算所有延迟对象,提取元组中的列表部分 computed_list = compute(delayed_dicts)[0] # 转换为 DataFrame df = pd.DataFrame(computed_list)
修正方案二:用 @delayed 装饰 combine 函数(更简洁)
将整个 combine 函数标记为延迟执行,代码结构更清晰:
from dask import delayed, compute import pandas as pd @delayed def combine(val): # 这里直接调用 rss 和 altman,不需要再用 delayed() 包裹 a = rss(val) b = altman(val) return {'Tiker': val, 'RS': a, 'Alt': b} vals = tickers # 生成延迟对象列表 delayed_results = [combine(val) for val in vals] # 计算所有延迟结果 computed_results = compute(*delayed_results) # 转换为 DataFrame df = pd.DataFrame(computed_results)
或者也可以这样计算(结果一致):
computed_results = compute(delayed_results)[0] df = pd.DataFrame(computed_results)
验证结果
执行上述代码后,df 会是一个标准的 pandas DataFrame,包含 Tiker、RS 和 Alt 三列,对应你需要的数据。
内容的提问来源于stack exchange,提问作者user19858347
相关产品推荐
相关产品推荐

