仪表板 "Column assignment doesn't support type numpy.ndarray"

Dask "Column assignment doesn't support type numpy.ndarray"

我正在尝试使用 Dask 而不是 pandas,因为我正在分析的数据量非常大。我想根据几个条件添加一个标志列。

import dask.array as da
data['Flag'] = da.where((data['col1']>0) & (data['col2']>data['col4'] | data['col3']>data['col4']), 1, 0).compute()

但是,然后我收到以下错误消息。上面的代码在 np.where 与 pandas 数据框一起使用时完美运行,但不适用于 dask.array.where.

如果 numpy 工作并且操作是 row-wise,那么一种解决方案是使用 .map_partitions:

def create_flag(data):
    data['Flag'] = np.where((data['col1']>0) & (data['col2']>data['col4'] | data['col3']>data['col4']), 1, 0)
    return data

ddf = ddf.map_partitions(create_flag)

您可以使用dask.dataframe.Series.where来获得相同的结果,但不需要计算。或者更好的是,您可以利用 True/False 值可以直接转换为 1/0 的事实,只需将类型提升为 int(见下文)。

这两个选项都具有将所有操作保留为 dask.dataframe 的优势,从而使调度程序比 non-dask 使用 map_partitions 调用的操作或直接分配计算结果。

data['Flag'] = (
    (data['col1']>0)
    & ((data['col2']>data['col4']) | (data['col3']>data['col4']))
).astype(int)