我从delayed
个对象构建数据框,返回单个(pandas)数据框,并向meta
调用提供from_delayed
。
延迟对象返回的列顺序与meta
中提供的列顺序不匹配。
在这种情况下,dask会混淆并根据所要求的计算混合两个排序之间的数据。
e.g:
import pandas as pd
import dask.dataframe as dd
from dask import delayed
source = pd.DataFrame(
columns=['(1)', '(2)', 'date', 'ent', 'val'],
data=[range(i*5, i*5+5) for i in range(3)],
index=range(3)
)
# Note the meta doesn't have the same ordering for columns
meta = pd.DataFrame(
columns=['date', 'ent', 'val', '(1)', '(2)'],
data=[range(5)]
)
# This works
ddf = dd.from_delayed([delayed(lambda: source)()], meta=meta)
# one result
ddf.compute()
# (1) | (2) | date | ent | val
# --- | --- | ---- | --- | ---
# 0 | 1 | 2 | 3 | 4
# 5 | 6 | 7 | 8 | 9
# 10 | 11 | 12 | 13 | 14
# a very different one
ddf.reset_index().compute()
# index | date | ent | val | (1) | (2)
# ----- | ---- | --- | --- | --- | ---
# 0 | 0 | 1 | 2 | 0 | 0
# 1 | 5 | 6 | 7 | 10 | 5
# 2 | 10 | 11 | 12 | 20 | 10
答案 0 :(得分:2)
正如@mdurant所建议的那样,可以强制排序:
ddf = ddf.map_partitions(lambda x: x[['date', 'ent', 'val', '(1)', '(2)']])
关于from_delayed
的结果。
如果该函数可以访问排序,那么也可以在delayed
对象调用的函数中完成。