当元数据元素与单个数据框架之间的列顺序不同时,Dask不一致行为

时间:2018-04-18 14:23:51

标签: dask

我从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

1 个答案:

答案 0 :(得分:2)

正如@mdurant所建议的那样,可以强制排序:

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

关于from_delayed的结果。

如果该函数可以访问排序,那么也可以在delayed对象调用的函数中完成。