Непоследовательное поведение в случае, когда порядок столбцов отличается между мета и отдельными фреймами данных.
Я строю датафрейм из delayed
объекты, которые возвращают отдельные (панды) кадры данных, и я предоставляю 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
1 ответ
Решение
По предложению @mdurant, порядок может быть принудительным:
ddf = ddf.map_partitions(lambda x: x[['date', 'ent', 'val', '(1)', '(2)']])
на результат from_delayed
,
Это также можно сделать с помощью функции, вызываемой delayed
объект, если эта функция имеет доступ к порядку.