当元数据帧和单个数据帧之间的列顺序不同时,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
对象调用的函数中完成,前提是该函数可以访问排序。
我正在从 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
对象调用的函数中完成,前提是该函数可以访问排序。