【问题标题】:Dask: convert a dask.DataFrame to an xarray.DatasetDask:将 dask.DataFrame 转换为 xarray.Dataset
【发布时间】:2020-03-28 01:38:06
【问题描述】:

这在熊猫中是可能的。

我想用 dask 来做。

编辑:提早here

仅供参考,您可以通过 xarray.Dataset to a Dask.DataFrame 访问

使用.to_xarry 的熊猫解决方案:

import pandas as pd
import numpy as np

df = pd.DataFrame([('falcon', 'bird', 389.0, 2),
                   ('parrot', 'bird', 24.0, 2),
                   ('lion', 'mammal', 80.5, 4),
                   ('monkey', 'mammal', np.nan, 4)],
                  columns=['name', 'class', 'max_speed',
                           'num_legs'])

df.to_xarray()
<xarray.Dataset>
Dimensions:    (index: 4)
Coordinates:
  * index      (index) int64 0 1 2 3
Data variables:
    name       (index) object 'falcon' 'parrot' 'lion' 'monkey'
    class      (index) object 'bird' 'bird' 'mammal' 'mammal'
    max_speed  (index) float64 389.0 24.0 80.5 nan
    num_legs   (index) int64 2 2 4 4

Dask 解决方案?

import dask.dataframe as dd

ddf = dd.from_pandas(df, 1)

?

可以使用 xarray 寻找解决方案,但我认为它只有 .from_dataframe

import xarray as xr

ds = xr.Dataset()
ds.from_dataframe(ddf.compute())

【问题讨论】:

    标签: pandas dask python-xarray dask-dataframe


    【解决方案1】:

    所以这是可能的,我在这里做了一个 PR 来实现它 - https://github.com/pydata/xarray/pull/4659

    提供Dataset.from_dask_dataframeDataArray.from_dask_series两种方法。

    尚未合并的主要原因是我们试图用尽可能少的 dask 计算来计算块大小。

    在这些问题中有更多上下文:https://github.com/pydata/xarray/issues/4650https://github.com/pydata/xarray/issues/3929

    【讨论】:

      【解决方案2】:

      我一直在寻找类似的东西并创建了这个功能(它并不完美,但效果很好)。 它还将所有 dask 数据保存为 dask 数组,从而节省内存等。

      import xarray as xr
      import dask.dataframe as dd
              
      def dask_2_xarray(ddf, indexname='index'):
           ds = xr.Dataset()
           ds[indexname] = ddf.index
           for key in ddf.columns:
               ds[key] = (indexname, ddf[key].to_dask_array().compute_chunk_sizes())
           return ds
                  
      # use:
      ds = dask_2_xarray(ddf)
      

      示例:

      path = LOCATION TO FILE
      ddf_test = dd.read_hdf(path, key="/data*", sorted_index=True, mode='r')
      ds = dask_2_xarray(ddf_test, indexname="time")
      ds
      

      结果:

      大部分时间都花在计算块的大小上,所以如果有人知道更好的方法,它会更快。

      【讨论】:

      【解决方案3】:

      此方法当前不存在。如果您认为它应该存在,那么我鼓励您提出 github 问题作为功能请求。不过,您可能想标记一些 Xarray 人。

      【讨论】:

      • 有人为此提出过问题吗?
      • @Ryan 刚刚添加到帖子中
      猜你喜欢
      • 2016-12-24
      • 2019-12-09
      • 1970-01-01
      • 2021-09-12
      • 1970-01-01
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      相关资源
      最近更新 更多