当元数据帧和单个数据帧之间的列顺序不同时,Dask 行为不一致

Dask inconsistent behavior when column order differs between meta and individual DataFrames

我正在从 delayed 个对象构建一个数据框,其中 returns 个单独的 (pandas) 个数据框,我将 meta 提供给 from_delayed 调用.

碰巧延迟对象返回的列顺序与 meta 中提供的顺序不匹配。

在那种情况下,dask 会混淆并根据所要求的计算混淆两个排序之间的数据。

例如:

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

如@mdurant 所提议,可以强制排序:

ddf = ddf.map_partitions(lambda x: x[['date', 'ent', 'val', '(1)', '(2)']])

基于 from_delayed.

的结果

这也可以在 delayed 对象调用的函数中完成,前提是该函数可以访问排序。