如何解决带有两个数据框的 Dask 折叠
这是关于如何使用 Dask(特别是使用折叠)添加两个 DataFrame 的教科书问题......不过我似乎无法让它工作,所以我想伸出手看看我做错了什么.
(我使用的是 Python 3.8.5 和 Dask 2021.4.1)
下面的代码显示了我的意图:
from dask import delayed,bag
import pandas as pd
def get_df1():
return pd.DataFrame({'a': [1,2,3],'b': [4,5,6]})
def get_df2():
return pd.DataFrame({'a': [3,1],'b': [6,4]})
def addit(a,b):
return a + b
if __name__ == '__main__':
# Without dask
y = addit(get_df1(),get_df2())
print(y)
# The above code prints the desired answer:
# a b
# 0 4 10
# 1 4 10
# 2 4 10
# With dask/delayed + bag + fold
xs = [delayed(get_df1)(),delayed(get_df2)()]
b1 = bag.from_delayed(xs)
y = b1.fold(addit)
print(y.compute())
# This prints an unexpected result
# abab
答案(根据下面的评论):
from dask import delayed,bag
import pandas as pd
def get_df1():
return [pd.DataFrame({'a': [1,6]})] # Now a list
def get_df2():
return [pd.DataFrame({'a': [3,4]})] # Now a list
def addit(a,b):
return a + b
if __name__ == '__main__':
# Without dask
y = addit(*get_df1(),*get_df2())
print(y)
# The above code prints the desired answer:
# a b
# 0 4 10
# 1 4 10
# 2 4 10
# With dask/delayed + bag + fold
xs = [delayed(get_df1)(),delayed(get_df2)()]
b1 = bag.from_delayed(xs)
y = b1.fold(addit)
print(y.compute())
# The above code now also prints the desired answer:
# a b
# 0 4 10
# 1 4 10
# 2 4 10
解决方法
问题出现在这一步:
b1 = bag.from_delayed(xs)
发生的情况是 .from_delayed
期望每个延迟评估为列表,因此您需要修改函数以返回数据帧列表:
def get_df1():
return [pd.DataFrame({'a': [1,2,3],'b': [4,5,6]})]
def get_df2():
return [pd.DataFrame({'a': [3,1],'b': [6,4]})]
之后你的代码应该可以工作了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。