Dask:将dask.DataFrame转换为xarray.Dataset

4

这在pandas中是可行的。

我想用dask来做。

编辑:在dask上提出此处的问题

顺便说一下,你可以从xarray.Dataset转换为Dask.DataFrame

使用.to_xarry的Pandas解决方案:

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())
3个回答

3

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

结果: 在Jup.Lab中的结果数组

大部分时间都花费在计算块大小上,如果有人知道更好的方法来做这件事,那么速度会更快。


1
你可以将此添加到https://github.com/pydata/xarray/issues/3929。 - Ray Bell

1
这个方法目前不存在。如果您认为它应该存在,我鼓励您提出一个 GitHub 问题作为功能请求。不过您可能需要标记一些 Xarray 的人。

1
有人为此创建了问题吗? - Ryan
@Ryan 刚刚添加了一篇文章。 - Ray Bell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接