在dask中,我得到一个错误:"ValueError:计算数据中的列与提供的元数据中的列不匹配

这对我来说没有意义,因为我确实提供了正确的元数据.它不是按照dict中的规定订购的.

下面是一个简单的工作示例:

from datetime import date
import pandas as pd
import numpy as np
from dask import delayed
import dask.dataframe as dsk

# Making example data
values = pd.DataFrame({'date' : [date(2020,1,1), date(2020,1,1), date(2020,1,2), date(2020,1,2)], 'id' : [1,2,1,2], 'A': [4,5,2,2], 'B':[7,3,6,1]})
def get_dates():
    return pd.DataFrame({'date' : [date(2020,1,1), date(2020,1,1), date(2020,1,2), date(2020,1,2)]})
def append_values(df):
    df2 = pd.merge(df, values, on = 'date', how = 'left')
    return df2
t0 = pd.DataFrame({'date' : [date(2020,1,1), date(2020,1,1), date(2020,1,2), date(2020,1,2)]})
t1 = delayed(t0)
t2 = dsk.from_delayed(t1)
t = t2.map_partitions(append_values, meta = {'A' : 'f8', 'B': 'i8', 'id' : 'i8', 'date' : 'object'}, enforce_metadata = False)

# Applying a grouped function.
def func(x,y):
    return pd.DataFrame({'summ' : [np.mean(x) + np.mean(y)], 'difference' : [int(np.floor(np.mean(x) - np.mean(y)))]})

# Everything works when I compute the dataframe before doing the apply. But I want to distribute the apply so I dont like this option.
res = t.compute().groupby(['date']).apply(lambda df: func(df['A'], df['B']))
# This fails as the meta is out of order. But the meta is in a dict and is hence not supposted to be ordered anyway!
res = t.groupby(['date']).apply(lambda df: func(df['A'], df['B'])).compute()

我做错了什么?我该如何修复它?虽然一种解决方法是在执行分组操作之前进行计算,但这在我的实际情况下是不可行的(在RAM中存储的数据太多).

还有一个可能相关的问题,但我不认为是:ValueError: The columns in the computed data do not match the columns in the provided metadata.这似乎与dask的csv解析有关

推荐答案

提供给metadict的 keys 顺序似乎很重要.按以下方式更改顺序只会产生警告:

    # changing the order of keys in this dict
    # meta={"date": "object", "id": "i8", "B": "i8", "A": "f8", },
    meta={"date": "object", "id": "i8", "A": "f8", "B": "i8"},

我的猜测是Dask在内部使用密钥顺序来构造元数据框架,但不太确定.问题是,在t.compute()之后,df是pandas dataframe,因此后续的groupby知道要 Select 哪些列(不依赖顺序),而在.compute之前,dataframe仍然是dask dataframe(惰性),dask试图寻找一个具有meta中给定顺序的列(然后发现不匹配)...

Python相关问答推荐

如何将ctyles.POINTER(ctyles.c_float)转换为int?

在线条上绘制表面

计算组中唯一值的数量

递归访问嵌套字典中的元素值

什么是最好的方法来切割一个相框到一个面具的第一个实例?

如何在turtle中不使用write()来绘制填充字母(例如OEG)

如何从需要点击/切换的网页中提取表格?

手动设置seborn/matplotlib散点图连续变量图例中显示的值

用SymPy在Python中求解指数函数

为什么Python内存中的列表大小与文档不匹配?

Discord.py -

在电影中向西北方向对齐""

使用Python TCP套接字发送整数并使用C#接收—接收正确数据时出错

获取git修订版中每个文件的最后修改时间的最有效方法是什么?

你能把函数的返回类型用作其他地方的类型吗?'

如果不使用. to_list()[0],我如何从一个pandas DataFrame中获取一个值?

文本溢出了Kivy的视区

替换包含Python DataFrame中的值的<;

对当前的鼹鼠进行编码,并且我的按键获得了注册

在使用ROLING()获得最大值时,是否可以排除每个窗口中的前n个值?